【发布时间】:2013-09-26 15:03:56
【问题描述】:
我已阅读 数据库系统概念,第 6 版,Silberschatz。我将在 MySQL 上的 OS X 上实现第 2 章中所示的大学数据库系统。但是我在创建表course 时遇到了麻烦。表department 看起来像
mysql> select * from department
-> ;
+------------+----------+-----------+
| dept_name | building | budget |
+------------+----------+-----------+
| Biology | Watson | 90000.00 |
| Comp. Sci. | Taylor | 100000.00 |
| Elec. Eng. | Taylor | 85000.00 |
| Finance | Painter | 120000.00 |
| History | Painter | 50000.00 |
| Music | Packard | 80000.00 |
| Physics | Watson | 70000.00 |
+------------+----------+-----------+
mysql> show columns from department
-> ;
+-----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+-------+
| dept_name | varchar(20) | NO | PRI | | |
| building | varchar(15) | YES | | NULL | |
| budget | decimal(12,2) | YES | | NULL | |
+-----------+---------------+------+-----+---------+-------+
创建表course会导致以下错误。
mysql> create table course
-> (course_id varchar(7),
-> title varchar (50),
-> dept_name varchar(20),
-> credits numeric(2,0),
-> primary key(course_id),
-> foreign key (dept_name) references department);
ERROR 1215 (HY000): Cannot add foreign key constraint
在google上搜索外键约束后,我才知道“外键约束”这个词表示表course中的外键列的数据必须存在于表department的主键列中。但是我应该在插入数据时遇到这个错误。
如果不是,为什么作者让我执行那个 SQL 语句?
如果我真的执行了错误的SQL语句,插入一些数据后是否必须在课程表中指定dept_name作为外键?
编辑:在mysql> 中输入set foreign_key_checks=0 并不能修复错误。
------------------------
LATEST FOREIGN KEY ERROR
------------------------
2013-09-21 16:02:20 132cbe000 Error in foreign key constraint of table university/course:
foreign key (dept_name) references department):
Syntax error close to:
)
mysql> set foreign_key_checks=0
-> ;
Query OK, 0 rows affected (0.00 sec)
mysql> create table course
-> (course_id varchar(7),
-> title varchar(50),
-> dept_name varchar(20),
-> credits numeric(2,0),
-> primary key(course_id),
-> foreign key (dept_name) references department);
ERROR 1215 (HY000): Cannot add foreign key constraint
【问题讨论】:
-
两个表中的所有
dept_name都是 varchar(15)。我必须在哪里输入set foreign_key_checks=0? -
LATEST FOREIGN KEY ERROR说什么? -
foreign key (dept_name) references department是 ANSI 标准 SQL。也许作者没有使用 MySQL,而是使用了更符合标准的 DBMS。 -
@inherithandle:作者确实给了你正确的SQL,只是MySQL在这方面(以及许多其他)不符合ANSI标准