mysql on delete cascade-仅在设置主键时工作

70gysomp  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(301)

我一直面临着一个问题 ON DELETE CASCADE 在mysql中。当它设置在主键字段上时,它可以完美地工作,但在其他情况下则不行。
例如,我有一个子表,其中有一个外键引用父表中的字段,但子表有自己的自动增量id字段,该字段必须是主键,因为子表引用它。
当我从父表中删除一行时,所有记录都会像预期的那样消失,并且不会出现任何错误,但是依赖于父表已删除行的子表数据保持不变。
我做的研究没有结果。尽管我假设这与系统通过主键标识行有关,但我找不到任何相关信息。
父表:

CREATE TABLE IF NOT EXISTS table_parent (
            ID              TINYINT(3)    UNSIGNED PRIMARY KEY AUTO_INCREMENT,
            `level`         TINYINT(1)    NOT NULL,
            updated         DATETIME      NOT NULL DEFAULT NOW()
        );

子表:

CREATE TABLE IF NOT EXISTS table_child (
            ID              TINYINT(3)    UNSIGNED PRIMARY KEY AUTO_INCREMENT,
            parentId        TINYINT(3)    UNSIGNED NOT NULL,
            `name`          VARCHAR(16)   UNIQUE NOT NULL,
            updated         DATETIME      NOT NULL DEFAULT NOW()
        );

关系:

ALTER TABLE table_child
        ADD FOREIGN KEY (parentId)        REFERENCES table_parent(ID) ON DELETE CASCADE

简而言之,我的目标是删除表\子表中parentid等于表\父表中已删除行的所有记录。
感谢您的帮助,祝您愉快:)

xxhby3vn

xxhby3vn1#

在我看来,您缺少的是引用完整性约束只适用于innodb表。您的ddl语句缺少 engine=InnoDB 而且很有可能拖欠myisam的贷款。
虽然在声明中不会收到错误,但默认情况下,myisam表是在不指定引擎时得到的,myisam忽略约束语句。
正确的create table语句是:

CREATE TABLE IF NOT EXISTS table_parent (
        ID              TINYINT(3)    UNSIGNED PRIMARY KEY AUTO_INCREMENT,
        `level`         TINYINT(1)    NOT NULL,
         updated         DATETIME      NOT NULL DEFAULT NOW()
    ) ENGINE=InnoDB;

下面是一个sql沙盒,它演示了约束是正确的,并且按照您的期望工作。
这与这个问题无关,但我觉得奇怪的是,你宣布你所有的钥匙都是小钥匙。这意味着您的表中最多可以有255行。。。。

相关问题