如何在两个条件下(为具有唯一约束的版本行)正确定义联接表的唯一约束

时间:2019-01-18 03:46:38

标签: mysql left-join unique-constraint

我想实现两个联接表中行的版本控制,同时保留一列值的唯一性。具体来说:

  • 表项
CREATE TABLE `item`
(
 `id` INT(10) UNSIGNED NOT NULL,
 `ver` INT(10) UNSIGNED NOT NULL COMMENT 'version of the record',
 `name` varchar(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',
 `active` ENUM('Y','N') NOT NULL DEFAULT 'Y' COLLATE 'utf8mb4_unicode_ci',
 PRIMARY KEY (`id`, `ver`),
 INDEX `name_idx` (`name`)
)
  • 表格变体
CREATE TABLE `variant`
(
 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 `itemid` INT(10) UNSIGNED NOT NULL,
 `itemver` INT(10) UNSIGNED NOT NULL,
 `symbol` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_unicode_ci',
 PRIMARY KEY (`id`),
 CONSTRAINT `FK_variant_item` FOREIGN KEY (`itemid`, `itemver`) REFERENCES `item` (`id`, `ver`)
)

为简洁起见,表定义当然会缩短。

因此,可以通过在递增item的同时复制item中的记录来实现版本控制。ver并停用上一行,然后复制表variant中的所有行使用相同的外键。这样,我始终可以查看以前的完整历史记录。

我仍然希望为给定的variantsymbol仅定义一次itemid,因此在此字段上需要唯一约束,并且这是我的困境:

  • 当仅在一列symbol上定义了唯一性时,根本无法复制variant行,
  • 如果在三列(itemid,itemver,symbol)上定义了唯一性,则可以为不同的项目插入相同的symbol,因此不能保证唯一性。
  • 最后,如果在(项目,符号)上定义了唯一,则可以为具有不同symbol的不同项目插入相同的itemver,可能会阻止以后复制variant ,最初是由它定义的。

那么如何保证在这种情况下只能为一项定义符号?

0 个答案:

没有答案