类似于ON DELETE CASCADE not working in MySQL,但有些不对劲:
-- test delete cascade
CREATE TABLE t1(
id SERIAL PRIMARY KEY,
data TEXT
);
CREATE TABLE t2(
id INT PRIMARY KEY REFERENCES t1(id) ON DELETE CASCADE,
data2 TEXT
);
INSERT INTO t1 VALUES(1, 'one');
INSERT INTO t2 VALUES(1, 'first');
DELETE FROM t1;
SELECT * FROM t2; -- should have not rows - have one!
在postgres中一直使用 ,但由于某种原因无法在mysql中使用它。
CREATE TABLE `t2` (
`id` BIGINT(20) UNSIGNED NOT NULL,
`data2` TEXT,
PRIMARY KEY (`id`),
CONSTRAINT `FK_t2_1` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) ON DELETE CASCADE
) ENGINE = InnoDB DEFAULT CHARSET = latin1;
对我来说,我的代码是ansi标准,非常有意义,并且(就SQL而言)美观,而mysql方式(感谢帮助!)让我想起Visual Basic或其他东西 - 这真是丑陋如同罪恶和imho认为聪明的人贬低自己写这样的东西是错误的。
如果咆哮,我道歉,并且应该得到任何数量的负面评价。你们轻松编写这些代码的人们对我非常尊重。我只是讨厌看到对朋友造成这种毫无意义的惩罚; - )
答案 0 :(得分:6)
如果您像这样创建t2,它可以正常工作:
CREATE TABLE `t2` (
`id` bigint(20) unsigned NOT NULL,
`data2` text,
PRIMARY KEY (`id`),
CONSTRAINT `FK_t2_1` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ETA,在回答对丑陋代码的担忧时,下面也有效:
CREATE TABLE t2 (
id bigint(20) unsigned NOT NULL PRIMARY KEY,
data2 text,
CONSTRAINT FOREIGN KEY (id) REFERENCES t1(id) ON DELETE CASCADE
) ENGINE=InnoDB ;
主要区别在于t2.id的数据类型必须与t1.id的数据类型匹配,并且必须在列之后声明约束。
答案 1 :(得分:4)
(假设它应该是“外键”而不是表t2中的“主键”)
MySQL在没有警告的情况下忽略了所有内联外键约束。
因此,你需要明确地添加一个外国人,如dnagirl所示
答案 2 :(得分:3)
将foreign_key_checks设置为1,在导出和导入数据时遇到此问题,在此期间将其设置为0
/ *!40014 SET @OLD_FOREIGN_KEY_CHECKS = @@ FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS = 1 * /;
答案 3 :(得分:0)
发生这种情况是因为默认存储引擎“ MyISAM”不支持外键!
只需将引擎设置为InnoDB,并使两个表的引用和引用列定义都匹配。
这是一个示例:
CREATE TABLE `students` (
`id` INT AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`age` TINYINT NOT NULL,
PRIMARY KEY(`id`)
) ENGINE=InnoDB CHARSET=latin1;
CREATE TABLE `marks` (
`student_id` INT PRIMARY KEY,
`mark` DECIMAL(5,2) NOT NULL,
CONSTRAINT marks_FK_1 FOREIGN KEY(`student_id`) REFERENCES students(`id`) ON DELETE CASCADE
) ENGINE=InnoDB CHARSET=latin1;