我想实现两个联接表中行的版本控制,同时保留一列值的唯一性。具体来说:
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
中的所有行使用相同的外键。这样,我始终可以查看以前的完整历史记录。
我仍然希望为给定的variant
。symbol
仅定义一次item
。id
,因此在此字段上需要唯一约束,并且这是我的困境:
symbol
上定义了唯一性时,根本无法复制variant
行,symbol
,因此不能保证唯一性。symbol
的不同项目插入相同的itemver
,可能会阻止以后复制variant
,最初是由它定义的。那么如何保证在这种情况下只能为一项定义符号?