【问题标题】:Add foreign key on delete cascade phpMyAdmin is not working在删除级联 phpMyAdmin 上添加外键不起作用
【发布时间】:2020-07-20 11:40:43
【问题描述】:

我有一个名为 book 的主表,其中包含字段 id_book(主要、唯一、自动递增)和 name。 我有一个名为 tag 的辅助表,其中包含字段 book_idtag

每本书可以有很多标签。我希望当我删除一本书时,所有标签也被删除。

我试过这个:

ALTER TABLE tag
ADD FOREIGN KEY (book_id)
REFERENCES book(id_book) 
ON UPDATE CASCADE
ON DELETE CASCADE

我知道我过去在其他项目中使用过这个 SQL 块并且它工作了,但现在它似乎不再工作了,我不知道为什么。如果我删除一本书,标签不会被删除。

【问题讨论】:

    标签: sql phpmyadmin


    【解决方案1】:

    我认为 SQL 本身没有任何问题,我认为问题不在于这个特定的外键。

    可能密钥没有注册或另一个外键阻止删除。

    我已经用这个 SQL 文件进行了测试,得到了想要的结果

       CREATE TABLE book (
        id_book INT AUTO_INCREMENT,
        name VARCHAR(10),
        PRIMARY KEY (id_book)
    );
    
    CREATE TABLE tag (
        id INT AUTO_INCREMENT,
        book_id INT,
        name VARCHAR(10),
        PRIMARY KEY (id)
    );
    
    ALTER TABLE tag
    ADD FOREIGN KEY (book_id)
    REFERENCES book(id_book)
    ON UPDATE CASCADE
    ON DELETE CASCADE;
    
    
    INSERT INTO book (`name`) VALUES ("test", "another", "and another");
    
    INSERT INTO tag (`book_id`, `name`) VALUES (1 , "first"), (2, "first"), (1, "second");
    

    【讨论】:

    • 密钥已设置,我没有其他密钥
    • 您可以随时使用此查询检查键是否确实在级联删除select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS where DELETE_RULE ='CASCADE' 如果您的键出现并且表书的行的删除不删除标签我最后的猜测是拼写错误。如果没有,请删除密钥并重新创建它。
    • 他们不在那里。这可能是什么原因?
    • 我找不到任何合理的原因,除了您第一次创建表时出现的问题。即使您要为外键重新运行 SQL,它也只会添加另一个带有 ON DELETE 的 SQL。使用ALTER TABLE tag DROP <name_of_your_key> 测试以删除任何现有密钥,您可以使用select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS where TABLE_NAME = "tag" 找到名称并使用您的 SQL 语句重新创建密钥,这样您就可以从一个干净的状态进入。
    • 我已删除该表,并使用您的 sql 代码再次创建它。之后我运行了外键代码,它仍然是一样的。会不会和MyISAM有关?
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 2013-06-22
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多