考虑以下SQL:
CREATE DATABASE TEST01234;
USE TEST01234;
CREATE TABLE PARENT (
PARENT_NAME varchar(255) PRIMARY KEY,
PARENT_DESC varchar(255));
CREATE TABLE CHILD (
PARENT_NAME varchar(255),
CHILD_NAME varchar(255),
CHILD_DESC varchar(255),
PRIMARY KEY (PARENT_NAME, CHILD_NAME),
FOREIGN KEY (PARENT_NAME) REFERENCES PARENT(PARENT_NAME)
ON UPDATE CASCADE
ON DELETE CASCADE);
INSERT INTO PARENT VALUES("PARENT A","Some Parent");
INSERT INTO CHILD VALUES("PARENT A","CHILD A","Some Child");
INSERT INTO CHILD VALUES("PARENT A","CHILD B","Some Child");
INSERT INTO CHILD VALUES("PARENT A","CHILD C","Some Child");
INSERT INTO CHILD VALUES("PARENT B","CHILD D","Non-present Parent");
DELETE FROM PARENT WHERE PARENT_NAME = "PARENT A";
SELECT * FROM CHILD;另外,
mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+---------------------+
| Variable_name | Value |
+-------------------------+---------------------+
| protocol_version | 10 |
| version | 5.1.41-3ubuntu12.10 |
| version_comment | (Ubuntu) |
| version_compile_machine | i486 |
| version_compile_os | debian-linux-gnu |
+-------------------------+---------------------+
5 rows in set (0.00 sec)有两件事正在发生,我原以为会有所不同。
*第一个是MySQL允许我在CHILD中插入与PARENT中的任何值都不匹配的值。我认为外键约束会阻止这种情况的发生。
*第二个问题是MySQL在从CHILD中删除PARENT A时,不会从PARENT A中删除PARENT记录。我认为cascade语句会实现这一点。
我觉得我漏掉了一些明显的东西。有什么建议吗?
发布于 2011-05-31 01:41:10
您需要指定对表使用InnoDB引擎。默认情况下,MySQL将使用MyISAM表,该表理解"create table“查询中的外键规范,但忽略键本身。
如果你做一个“show create table PARENT”,你很可能会看到ENGINE=MyISAM。
发布于 2011-05-31 01:44:22
你在使用InnoDB吗?MyISAM (MySQL中的默认引擎)不支持外键,而InnoDB支持。
https://stackoverflow.com/questions/6179220
复制相似问题