我一直面临着一个问题 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等于表\父表中已删除行的所有记录。
感谢您的帮助,祝您愉快:)
1条答案
按热度按时间xxhby3vn1#
在我看来,您缺少的是引用完整性约束只适用于innodb表。您的ddl语句缺少
engine=InnoDB
而且很有可能拖欠myisam的贷款。虽然在声明中不会收到错误,但默认情况下,myisam表是在不指定引擎时得到的,myisam忽略约束语句。
正确的create table语句是:
下面是一个sql沙盒,它演示了约束是正确的,并且按照您的期望工作。
这与这个问题无关,但我觉得奇怪的是,你宣布你所有的钥匙都是小钥匙。这意味着您的表中最多可以有255行。。。。