繁体   English   中英

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

[英]in mysql, on delete cascade not working

类似于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,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 或其他东西——它真的很丑作为罪孽和恕我直言,要求聪明的人贬低自己来写这样的东西是错误的。

如果咆哮,我深表歉意,理所当然地应该得到任何数量的负面评价。 你们轻松地编写了这段代码,这是我最大的敬意。 我只是讨厌看到这种对朋友施加的毫无意义的惩罚;-)

如果你像这样创建 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 的数据类型匹配,并且必须在列之后声明约束。

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

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

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

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

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

发生这种情况是因为默认存储引擎“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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM