mysql中的# ,删除级联不起作用
问题:mysql中的# ,删除级联不起作用 类似于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 REFERENCE
·
问题:mysql中的# ,删除级联不起作用
类似于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-standard,postgresql的方式,也有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 Basic 或其他东西——它真的很难看作为罪恶和恕我直言,要求聪明的人贬低自己来写这样的东西是错误的。
如果咆哮,我深表歉意,并且理应得到任何数量的负面评价。轻松编写此代码的你们是我最大的敬意。我只是讨厌看到对朋友施加这种毫无意义的惩罚;-)
解答
如果你像这样创建 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 的数据类型匹配,并且必须在列之后声明约束。
更多推荐
已为社区贡献23584条内容
所有评论(0)