问题: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 的数据类型匹配,并且必须在列之后声明约束。

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐