MySQL困境:跨表复合唯一键

时间:2011-10-20 13:53:45

标签: mysql unique-key

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

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

`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和date的复合唯一键。我知道我不能在表之间使用复合唯一键。我宁愿没有一个表来存储所有统计数据,因为我收集的实际分析可能因来源而异。我会更乐于摆脱“父母”表。

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

2 个答案:

答案 0 :(得分:3)

如果要使用date在子表中建立唯一约束,则需要子表中的external_id。您也可以 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`)
);

答案 1 :(得分:-1)

date字段移动到子表并声明一个唯一键:

ALTER TABLE child ADD UNIQUE INDEX parent_date (parent_id, `date`);