试图通过MySQL示例向其他人解释REFERENCES CONSTRAINT,但我无法使讨厌的示例正常工作!如果我将其定义为FOREIGN KEY,这似乎可行,但是我的教科书说我不必这样做(将其设为列级引用约束,而不是表级约束)。问题是,在对dept表中的dname进行UPDATE之后,为什么emp表中的dname不更改?-- SQL CODE BEGINSDROP TABLE IF EXISTS dept;DROP TABLE IF EXISTS emp;CREATE TABLE dept ( dname CHAR(10), dnum numeric(3,0)) ENGINE=InnoDB;CREATE TABLE emp ( dname CHAR(10) REFERENCES dept(dname) ON UPDATE CASCADE, ename CHAR(10)) ENGINE=InnoDB;INSERT INTO dept VALUES ("AAA", 111);INSERT INTO dept VALUES ("BBB", 222);INSERT INTO emp VALUES ("CCC", "Carol");INSERT INTO emp VALUES ("AAA", "Alice");SELECT * from dept;SELECT * from emp;UPDATE dept SET dname="XYZ" WHERE dnum=111;SELECT * from dept;SELECT * from emp;-- SQL CODE ENDS啊! 最佳答案 摘自《 MySQL 5.5参考手册》当引用被定义为列规范的一部分时,InnoDB不承认或不支持“内联引用规范”(在SQL标准中定义)。仅当作为单独的FOREIGN KEY规范的一部分指定时,InnoDB才接受REFERENCES子句。对于其他存储引擎,MySQL Server解析并忽略外键规范。http://dev.mysql.com/doc/refman/5.5/en/create-table.html我认为您的两本教科书的作者应该注意到,他们的推荐方法是在列定义上添加“ REFERENCES”子句,不会创建或强制执行外键约束。为了创建外键约束,您需要在目标列上具有唯一索引。就您而言,您需要在dept(dname)上建立索引。ALTER TABLE dept ADD CONSTRAINT dept_UX UNIQUE KEY (dname) ;有了它,您就可以创建一个外键约束:ALTER TABLE emp ADD CONSTRAINT FK_emp_dept FOREIGN KEY (dname) REFERENCES dept(dname) ON UPDATE CASCADE ;(通常,外键引用表的PRIMARY KEY。但是UNIQUE KEY就足够了。实际上,对于InnoDB,所需要的只是一个索引,它不必是唯一的,但是我们不想去那里。)要将dname声明为PRIMARY KEY而不是UNIQUE KEY:ALTER TABLE dept ADD PRIMARY KEY (dname) ;当REFERENCES子句添加到列定义时,我相信它会被MySQL忽略。 (该语法已被接受,但不会记录在数据字典中。如果您使用的是MyISAM,则没有关系,因为MyISAM不会强制执行外键约束。)为了创建外键约束作为表定义的一部分,我将其放在单独的行上: CREATE TABLE emp ( dname CHAR(10), ename CHAR(10), CONSTRAINT FK_emp_dept FOREIGN KEY (dname) REFERENCES dept(dname) ) ENGINE=InnoDB ;关于mysql - 为什么引用不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14415471/
10-11 04:33