2016-08-02 67 views
2

我创建了一个SQLFiddle,其代码如下所示。问题是在DELETE声明之后,关联的credit_card记录也应该被删除。为什么ON DELETE CASCADE不删除引用的记录?

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; 

我不知道为什么这不起作用。随着对credit_card_idUNIQUE约束,这是可能:

+--------------------------------------+ 
| person_credit_card     | 
+--------------------------------------+ 
| person_id | credit_card_id   | 
+--------------------------------------+ 
| 1   | 1      | 
+--------------------------------------+ 
| 2   | 1      | 
+--------------------------------------+ 

那我错在这里做什么,我怎样才能使它发挥作用?


我也试过例如删除person并删除所有他的credit_card记录(见本其他SQLFiddle):

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; 

但结果是,只有解析表正在失去它的条目,但credit_card记录仍然存在。

+0

从父表中删除将反映在子表中反之亦然 – 1000111

+0

投票结束为一个错字(不太可能对未来的读者有用) – Drew

+0

@Drew“* as a Typo *”? – displayname

回答

1

documentation

CASCADE:删除或从父表更新该行,并 子表中自动删除或更新匹配的行。 支持ON DELETE CASCADE和ON UPDATE CASCADE。

1

从person_credit_card中删除不会级联人员和credit_card。 级联的工作方式是删除/更新引用正在删除的记录的表中的记录。 换句话说,因为人没有参考person_credit_card的专栏,所以它不会被删除。