Как правильно определить уникальное ограничение для соединяемых таблиц при двух условиях (создание версий строк с уникальным ограничением) - PullRequest
0 голосов
/ 18 января 2019

Я хотел добиться контроля версий строк в двух соединенных таблицах при сохранении уникальности значений одного столбца. В частности:

  • элемент таблицы
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, которое изначально им было определено .

Так как же гарантировать, что символ может быть определен только для одного элемента в такой ситуации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...