我使用的数据库是mariadb,从创建第3个表“course”起出现错误:create table `university`.`course` (errno: 150 “Foreign key constraint is incorrectly formed”);
SQL语句如下:
create table course
(course_id varchar(8),
title varchar(50),
dept_name varchar(20),
credits numeric(2,0) check (credits > 0),
primary key (course_id),
foreign key (dept_name) references department
on delete set null
);
网上查出现该错误时,错误原因可能为COLLATE或者ENGINE不一致,但事实上是因为在’references‘后的‘department’未指定字段名称‘(dept_name)’。改为下面的语句就可以了:
create table course
(course_id varchar(8),
title varchar(50),
dept_name varchar(20),
credits numeric(2,0) check (credits > 0),
primary key (course_id),
foreign key (dept_name) references department (dept_name)
on delete set null
);
后面的类似。
附上mariadb官方的参考资料:
index_definition:
{INDEX|KEY} [index_name] [index_type] (index_col_name,…) [index_option] …
| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,…) [index_option] …
| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,…) [index_option] …
| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,…) [index_option] …
| [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,…) reference_definitionindex_col_name:
col_name [(length)] [ASC | DESC]index_type:
USING {BTREE | HASH | RTREE}index_option:
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_namereference_definition:
REFERENCES tbl_name (index_col_name,…)
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
[ON DELETE reference_option]
[ON UPDATE reference_option]reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION
其中reference_definition一项下面第一行为“REFERENCES tbl_name (index_col_name,…) ”,“(index_col_name,…)”是必需的。