在数据库中,我有一个用户名表,我有管辖权表。我还有一个中间表,可以将用户分配给一个或多个司法管辖区。
employee table
userID (primary Key)
firstName
lastName
records:
+--------+-----------+----------+
| userID | firstName | lastName |
+--------+-----------+----------+
| 6 | John | Doe |
| 11 | lisa | lopez |
+--------+-----------+----------+
jurisdictions table
jurId (Primary Key)
region
records:
+-------+--------------+
| jurID | jurisdiction |
+-------+--------------+
| 1 | California |
| 2 | Texas |
| 3 | Washington |
| 4 | South Dakota |
| 5 | Alaska |
| 6 | Ohio |
+-------+--------------+
user_jurisdiction
userID (Foriegn Key pointing to employees userID)
jurID (Foriegn Key pointing to jurisdictions jurID)
records:
+--------+-------+
| userID | jurID |
+--------+-------+
| 6 | 2 |
| 6 | 3 |
| 11 | 2 |
+--------+-------+
如果我删除父表行,我想把它放在哪里,将自动删除带有相应外键的中间表。我用以下内容制作了中间表:
CREATE TABLE user_jurisdiction(userID int NOT NULL, jurID int NOT NULL, FOREIGN KEY(userID) REFERENCES employee(userID) ON DELETE CASCADE, FOREIGN KEY (jurID) REFERENCES jurisdictions(jurID) ON DELETE CASCADE);
但是当我从父表中删除某些东西时......就像表jurisidictions.jurisdiction中的州名行一样...... userID和jurID行不会自动从中间表user_jurisdiction中删除。从我所看到的,我在每个外键上使DELETE ON CASCADE正确。当父表行被删除时,为什么不在中间表中删除带有外键的相应行?
答案 0 :(得分:1)
最可能的原因是您使用的是MyISAM引擎而不是INNODB引擎。 MyISAM引擎解析外键约束,但它不强制执行它们。
CREATE TABLE user_jurisdiction(
userID int NOT NULL,
jurID int NOT NULL,
FOREIGN KEY(userID)
REFERENCES employee(userID) ON DELETE CASCADE,
FOREIGN KEY (jurID)
REFERENCES jurisdictions(jurID) ON DELETE CASCADE
) ENGINE=INNODB;
INNODB是从5.5版开始的MySQL的默认存储引擎。之前MyISAM是默认的。
养成发布SQL DDL而不是(或同时)表的描述的习惯。 DDL比描述准确得多。