Почему этот MySql комбинированный уникальный ключ не работает? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть таблица MySql, созданная следующим образом:

CREATE TABLE `sourcelinks` (
   `idSourceLinks` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `SrcId` int(11) NOT NULL DEFAULT '-1',
   `LinkId` int(11) DEFAULT '-1',
   `ImageId` int(11) DEFAULT '-1',
   `DownloadId` int(11) DEFAULT '-1',
   `VideoId` int(11) DEFAULT '-1',
    PRIMARY KEY (`idSourceLinks`),
    UNIQUE KEY `idSourceLinks_UNIQUE` (`idSourceLinks`),
    UNIQUE KEY `UniqueCombination` (`SrcId`,`LinkId`,`ImageId`,`DownloadId`,`VideoId`)
    ) ENGINE=InnoDB AUTO_INCREMENT=491 DEFAULT CHARSET=latin1;

Как вы видите, у меня есть объединенный УНИКАЛЬНЫЙ ИНДЕКС по SrcId, LinkId, ImageId, DownloadId и VideoId. Теперь я понимаю, что если SrcId и LinkId имеют те же значения, что и другая строка, тогда будет выброшено исключение DUPLICATE INSERT. Это будет то же самое, что и SrcId и ImageId, или SrcId и DownloadId et c.

ВОПРОСЫ:

  1. Итак, почему это на самом деле не работает? Я получаю несколько столбцов с одинаковыми значениями, то есть несколько SrcId = 1 и LinkId = 1, а другие столбцы в индексе равны нулю?
  2. И как мне исправить это, чтобы каждая строка могла иметь только уникальные значения для столбцов

1 Ответ

2 голосов
/ 08 мая 2020

Уникальный индекс для (SrcId, LinkId, ImageId, DownloadId, VideoId) означает только то, что данная комбинация значений всех пяти из этих столбцов должна быть уникальной. Это не значит, что несколько записей не могут иметь одинаковые значения для SrcId и LinkId. Если вам это нужно, уникальный индекс должен быть на (SrcId, LinkId). Если бы это было первоначальным намерением уникального индекса с пятью столбцами, то, возможно, удалите его и замените его версией с двумя столбцами.

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