Я хотел добиться контроля версий строк в двух соединенных таблицах при сохранении уникальности значений одного столбца. В частности:
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
,
- когда уникальность определяется в трех столбцах (itemid, itemver, symbol), становится возможным вставить один и тот же
symbol
для другого элемента, поэтому уникальность не гарантируется.
- наконец, когда уникально определено для (itemver, символ), становится возможным вставить один и тот же
symbol
для другого элемента с другим itemver
, возможно, заблокировав будущее копирование variant
, которое изначально им было определено .
Так как же гарантировать, что символ может быть определен только для одного элемента в такой ситуации?