类似于ON DELETE CASCADE在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!
Run Code Online (Sandbox Code Playgroud)
使用此所有的时间在Postgres的,但由于某种原因不能让它在MySQL中去.
我正在慢慢学习,有ansi标准,postgreql方式,还有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;
Run Code Online (Sandbox Code Playgroud)
对我来说,我所拥有的代码是ansi标准,非常有意义,而且(就SQL而言)美学上令人愉悦,而mysql方式(感谢帮助!)让我想起了Visual Basic或其他东西 - 它真的很难看作为罪和imho,要求聪明的人贬低自己写这样的东西是错误的.
如果咆哮,我道歉,并且应该得到任何数量的负面评价.你们轻松编写这些代码的人们对我非常尊重.我只是讨厌在朋友身上看到这种毫无意义的惩罚;-)
如果你像这样创建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;
Run Code Online (Sandbox Code Playgroud)
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 ;
Run Code Online (Sandbox Code Playgroud)
主要区别在于t2.id的数据类型必须与t1.id的数据类型匹配,并且必须在列之后声明约束.
将foreign_key_checks设置为1,我在导出和导入数据时遇到了这个问题,期间它被设置为0
/*!40014 设置@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1 */;
| 归档时间: |
|
| 查看次数: |
14422 次 |
| 最近记录: |