我已经挖了好几个小时了,我很惊讶我还没有找到一个可靠的答案。必须有人这样做。也许我一直在搜索错误的关键字。
所以,我使用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'),则第一条记录(1,1,' en' )从表B中将自动获得CASCADE DELETEd。
但是,如果另一方面我要从表A中删除第二条记录(1,' zh'),表B中不会删除任何内容,因为表B中不存在这样的唯一记录
现在,在回答之前,我想提出一个重点。
我注意到这可以通过向表A添加一个PK列来完成,并使表B引用新列而不是复合键集。但出于各种原因,我无法做到这一点。我想看看是否有一种方法可以正确地实现这一点。
先谢谢你们!
干杯, 托马斯
答案 0 :(得分:0)
不幸的是,有了这种结构,经过无数个小时的研究和思考,目前还不可能,除非在下一个版本的MySQL中发布一些前沿的东西。
所以你在数据库级别上可以做的最好的事情就像我在我的问题中提到的那样:
答案 1 :(得分:0)
添加到test_i18_link
表创建语法的末尾:
约束FK_test_i18n_id
外键(test_i18n_id
,test_locale
)参考test_i18n
(test_i18n_id
,test_locale
)ON DELETE CASCADE