在mysql中,删除级联不起作用

cc *_*ung 10 mysql cascade

类似于ON DELETE CASCADE在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!
Run Code Online (Sandbox Code Playgroud)

使用此所有的时间在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;
Run Code Online (Sandbox Code Playgroud)

对我来说,我所拥有的代码是ansi标准,非常有意义,而且(就SQL而言)美学上令人愉悦,而mysql方式(感谢帮助!)让我想起了Visual Basic或其他东西 - 它真的很难看作为罪和imho,要求聪明的人贬低自己写这样的东西是错误的.

如果咆哮,我道歉,并且应该得到任何数量的负面评价.你们轻松编写这些代码的人们对我非常尊重.我只是讨厌在朋友身上看到这种毫无意义的惩罚;-)

dna*_*irl 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;
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的数据类型匹配,并且必须在列之后声明约束.

  • 这有效 - 谢谢!- 但天哪,我不明白你们是如何以这种方式编程的 - 我真的很尊重你们!不知道(对我来说!)使用 mysql 会有多痛苦。 (3认同)
  • @cc young:我发布了一个更漂亮的版本,以表明MySQL不必看起来像撇号汤.我通常不会反复查看我的所有列和表名,因为它们不会强制执行良好的命名实践(例如不使用保留字或空格).但是大多数MySQL代码生成器都会加入反引号. (2认同)

a_h*_*ame 5

(假设应该是表 t2 中的“外键”而不是“主键”)

MySQL 只是在没有警告的情况下忽略所有内联外键约束。

因此,您需要显式添加外键约束,如 dnagirl 所示。


zil*_*ani 5

将foreign_key_checks设置为1,我在导出和导入数据时遇到了这个问题,期间它被设置为0

/*!40014 设置@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1 */;