Mysql 为什么在删除级联上没有删除引用的记录?
我已经用下面所示的代码创建了一个。问题是在Mysql 为什么在删除级联上没有删除引用的记录?,mysql,Mysql,我已经用下面所示的代码创建了一个。问题是在DELETE语句之后,相关的信用卡记录也应该被删除 CREATE TABLE person ( id BIGINT AUTO_INCREMENT PRIMARY KEY ); CREATE TABLE credit_card ( id BIGINT AUTO_INCREMENT PRIMARY KEY ); CREATE TABLE person_credit_card ( person_id BIGINT NOT NULL, cre
DELETE
语句之后,相关的信用卡
记录也应该被删除
CREATE TABLE person (
id BIGINT AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE credit_card (
id BIGINT AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE person_credit_card (
person_id BIGINT NOT NULL,
credit_card_id BIGINT NOT NULL UNIQUE, -- Please note that this is UNIQUE
PRIMARY KEY(person_id, credit_card_id),
CONSTRAINT fk__person_credit_card__person
FOREIGN KEY (person_id)
REFERENCES person(id),
KEY pkey (credit_card_id),
CONSTRAINT fk__person_credit_card__credit_card
FOREIGN KEY (credit_card_id)
REFERENCES credit_card(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
INSERT INTO person (id) VALUES (1);
INSERT INTO credit_card (id) VALUES (1);
INSERT INTO person_credit_card (person_id, credit_card_id) VALUES (1, 1);
DELETE FROM person_credit_card WHERE credit_card_id = 1;
我不知道这为什么不起作用。在信用卡id上有唯一的约束时,这是不可能的:
+--------------------------------------+
| person_credit_card |
+--------------------------------------+
| person_id | credit_card_id |
+--------------------------------------+
| 1 | 1 |
+--------------------------------------+
| 2 | 1 |
+--------------------------------------+
那么,我在这里做错了什么?我如何才能让它发挥作用
我还尝试删除一个人
并删除他所有的信用卡
记录(见其他):
但结果是,只有解析表丢失了其条目,但信用卡记录仍然存在。来自:
级联:从父表中删除或更新行,并
自动删除或更新子表中的匹配行。
同时支持删除级联和更新级联
从个人信用卡中删除不会级联个人或信用卡。
Cascade的工作原理是从引用被删除记录的表中删除/更新记录。
换句话说,由于person没有涉及person\u credit\u card的列,因此它不会被删除。从父表中删除将反映在子表中,而不是在子表中以拼写错误(不太可能对未来读者有用)@Drew“作为拼写错误”?表示n-n关系的组合需要触发器,或类似的后处理技术。在Sebas正确完成后,n-n的合成可以在FK中进行
CREATE TABLE person (
id BIGINT AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE credit_card (
id BIGINT AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE person_credit_card (
person_id BIGINT NOT NULL,
credit_card_id BIGINT NOT NULL UNIQUE,
PRIMARY KEY(person_id, credit_card_id),
CONSTRAINT fk__person_credit_card__person
FOREIGN KEY (person_id)
REFERENCES person(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk__person_credit_card__credit_card
FOREIGN KEY (credit_card_id)
REFERENCES credit_card(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
INSERT INTO person (id) VALUES (1);
INSERT INTO person (id) VALUES (2);
INSERT INTO credit_card (id) VALUES (1);
INSERT INTO credit_card (id) VALUES (2);
INSERT INTO credit_card (id) VALUES (3);
INSERT INTO person_credit_card (person_id, credit_card_id) VALUES (1, 1);
INSERT INTO person_credit_card (person_id, credit_card_id) VALUES (1, 2);
INSERT INTO person_credit_card (person_id, credit_card_id) VALUES (2, 3);
DELETE FROM person WHERE id = 1;