删除父项时,Mysql'删除时级联'在外键行上不删除

时间:2013-04-04 11:10:17

标签: mysql database-design foreign-keys primary-key cascading-deletes

在数据库中,我有一个用户名表,我有管辖权表。我还有一个中间表,可以将用户分配给一个或多个司法管辖区。

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正确。当父表行被删除时,为什么不在中间表中删除带有外键的相应行?

1 个答案:

答案 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比描述准确得多。