gpt4 book ai didi

MySQL困境: composite unique key across tables

转载 作者:行者123 更新时间:2023-11-29 02:34:15 25 4
gpt4 key购买 nike

我正在尝试为我从多个来源收集的一些统计数据实现一个“扩展”表结构。

我的“父”表看起来像这样:

`test_parent` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`actions` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
)

我的第一个“子”表看起来像这样(最终我将为每个源创建一个子表):

`test_child` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`test_parent_id` int(11) unsigned NOT NULL,
`external_id` int(11) NOT NULL,
`external_actions` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `test_parent_id` (`test_parent_id`)
)
CONSTRAINT `test_child_ibfk_1` FOREIGN KEY (`test_parent_id`) REFERENCES `test_parent` (`id`)

所有这些在我的实现中都可以正常工作(我将使用 Java/Hibernate);但是,对于第一个子表,我需要一个用于 external_id 和日期的复合唯一键。我知道我不能跨表使用复合唯一键。我宁愿没有一张表来存储所有统计数据,因为我收集的实际分析可能因来源而异。我更愿意摆脱“父”表。

还有其他方法可以解决这个问题吗?如果可能,我希望避免使用触发器来强制执行唯一性。

最佳答案

如果您想使用 external_id 对其建立唯一约束,则需要子表中的 date。您可以date 存在于父表中,并通过外键引用它。这将使您将来可以通过其他子表以不同方式支持 date

CREATE TABLE `test_parent` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`actions` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`, `date`)
);

CREATE TABLE `test_child` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`test_parent_id` int(11) unsigned NOT NULL,
`date` date NOT NULL,
`external_id` int(11) NOT NULL,
`external_actions` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `test_parent_id` (`external_id`,`date`),
CONSTRAINT `test_child_ibfk_1` FOREIGN KEY (`test_parent_id`, `date`)
REFERENCES `test_parent` (`id`,`date`)
);

关于MySQL困境: composite unique key across tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7836995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com