MySQL:删除唯一组合键集上的级联

MySQL: DELETE CASCADE on a unique composite key set

我已经研究这个问题好几个小时了,我很惊讶我还没有找到可靠的答案。一定有人在做这件事。可能我一直在搜索错误的关键字。

所以,我正在使用 MySQL、InnoDB(当然),因为我的问题与外键和关系有关。

我想做的是构建一个 ON DELETE CASCADE 定义。

如您所见,我的 table "test_i18n" 有一个复合主键,由 test_i18n_id 和 test_locale 构建。这些都不是独一无二的。但在一起时,它们形成了独特的一对。

让我们称之为Table A.

CREATE TABLE IF NOT EXISTS `test_i18n` (
  `test_i18n_id` int(11) NOT NULL AUTO_INCREMENT,
  `test_locale` enum('en','zh') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'en',
  PRIMARY KEY (`test_i18n_id`,`test_locale`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

我现在有另一个 table。对于 table A 中的每一对,我可以添加一条或多条与 table A 相关的记录。

我们称这个为Table B.

CREATE TABLE IF NOT EXISTS `test_i18_link` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `test_i18_id` int(11) NOT NULL,
  `locale` enum('en','zh') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'en',
  PRIMARY KEY (`id`),
  UNIQUE KEY `test_i18_id` (`test_i18_id`,`locale`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

这里只是一些测试数据。

INSERT INTO `test_i18n` (`test_i18n_id`, `test_locale`) VALUES
(1, 'en'),
(1, 'zh'),
(2, 'en'),
(2, 'zh');

INSERT INTO `test_i18_link` (`test_i18_id`, `locale`, `url`) VALUES
(1, 'en', 'http://www.google.com'),
(2, 'en', 'http://www.yahoo.com');

现在,我要实现的是,如果我从Table A中删除第一条记录(1, 'en'),第一条记录(1, 1, 'en' ) 来自 Table B 将自动获得 CASCADE DELETEd。

但是,另一方面,如果我要从 Table A 中删除第二条记录 (1, 'zh'),则 Table B 中的任何内容都不会被删除,因为这样的独特Table B.

中不存在对

现在,在回答之前,我想说明一个重点。

我确实注意到,这可以通过向 Table A 添加一个 PK 列来完成,并让 Table B 引用该新列而不是复合键集。但由于种种原因我不能这样做。我想看看是否有一种方法可以真正正确地实现这一点。

提前谢谢大家!

干杯, 托马斯

不幸的是,对于这种结构,经过无数小时的研究和思考,目前是不可能的,除非 MySQL 的下一版本发布了一些最前沿的东西。

因此,您可以在数据库级别上做的最好的事情是,就像我最初在问题中提到的那样:

  • 向 Table A 添加一个 PK 列,并让 Table B 引用该新列而不是复合键集。

添加到您的 test_i18_link table 创建语法的末尾:

约束 FK_test_i18n_id 外键 (test_i18n_id,test_locale) 引用 test_i18n (test_i18n_id,test_locale) 删除级联