繁体   English   中英

MySQL:在唯一的复合键集上删除CASCADE

[英]MySQL: DELETE CASCADE on a unique composite key set

我已经研究了好几个小时,但很惊讶我没有找到一个可靠的答案。 必须有人这样做。 也许我一直在搜索错误的关键字。

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

我正在尝试做的是建立一个ON DELETE CASCADE定义。

如您所见,我的表“ test_i18n”具有一个复合主键,即test_i18n_id和test_locale的构建。 这些都不是唯一的。 但是,它们一起形成了独特的一对。

我们将此表称为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 ;

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

我们将此表称为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');

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

但是,另一方面,如果我要从表A中删除第二条记录(1,“ zh”),则表B中不会删除任何记录,因为表B中不存在这样的唯一对。

现在,在回答之前,我想提出一个重要的观点。

我确实注意到,可以通过在表A中添加一个PK列来完成此操作,并让表B引用该新列而不是组合键集。 但是由于种种原因,我无法做到这一点。 我想看看是否有一种方法可以正确地实现这一目标。

在此先感谢大家!

干杯,托马斯

不幸的是,采用这种结构,经过无数小时的研究和思考,目前尚不可能,除非在下一版本的MySQL中发布了一些前沿技术。

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

  • 在表A中添加一个PK列,并让表B引用该新列而不是组合键集。

test_i18_link表创建语法的末尾添加:

约束FK_test_i18n_id外键( test_i18n_idtest_locale )参考test_i18ntest_i18n_idtest_locale )ON DELETE CASCADE

暂无
暂无

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

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