类似于ON DELETE CASCADE not working in MySQL,但有些地方不对劲:
ANSI方法
-- 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中运行。
我正在慢慢学习,有ansi标准,postgreql方式,还有mysql方式。每次我觉得我有点欣赏到这种差异,我就没有接近。
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之类的东西--它真的像罪恶一样丑陋,让聪明的人贬低自己写这样的东西是不对的。
如果我大喊大叫的话,我很抱歉,我应该得到多少负面的评价。你们这些轻松编写这段代码的人,我最尊敬你们。我只是不喜欢看到这种对朋友毫无意义的惩罚;-)
发布于 2011-09-06 13:06:06
如果您像这样创建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匹配,约束必须在列之后声明。
发布于 2011-09-06 13:08:27
(假设这应该是表t2中的“外键”而不是“主键”)
MySQL只是忽略所有内联外键约束,而没有警告。
因此,您需要显式地添加外键约束,如dnagirl所示。
发布于 2017-01-17 07:07:17
将foreign_key_checks设置为1时,我在导出和导入数据时遇到了这个问题,在此期间它被设置为0。
/*!40014套@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=1 */;
https://stackoverflow.com/questions/7320236
复制相似问题