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

时间:2011-09-06 12:54:40

标签: mysql cascade

类似于ON DELETE CASCADE not working in MySQL,但有些不对劲:

ANSI Way

-- 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 Basic或其他东西 - 这真是丑陋如同罪恶和imho认为聪明的人贬低自己写这样的东西是错误的。

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

4 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:4)

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

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

因此,你需要明确地添加一个外国人,如dnagirl所示

答案 2 :(得分:3)

将foreign_key_checks设置为1,在导出和导入数据时遇到此问题,在此期间将其设置为0

/ *!40014 SET @OLD_FOREIGN_KEY_CHECKS = @@ FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS = 1 * /;

答案 3 :(得分:0)

发生这种情况是因为默认存储引擎“ MyISAM”不支持外键!

只需将引擎设置为InnoDB,并使两个表的引用和引用列定义都匹配。

这是一个示例:

CREATE TABLE `students` (
  `id` INT AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `age` TINYINT NOT NULL,
  PRIMARY KEY(`id`)
) ENGINE=InnoDB CHARSET=latin1;

CREATE TABLE `marks` (
  `student_id` INT PRIMARY KEY,
  `mark` DECIMAL(5,2) NOT NULL,
  CONSTRAINT marks_FK_1 FOREIGN KEY(`student_id`) REFERENCES students(`id`) ON DELETE CASCADE
) ENGINE=InnoDB CHARSET=latin1;