Как сделать уникальную комбинацию значений столбцов? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть таблица с такими данными:

id |  link  |  name  | date 
 1     aa      bob      1
 1     aa      tom      2
 1     bb      tom      3
 2     cc      lora     4

Это означает, что у меня не может быть уникальных значений в любом столбце, но я НЕ МОГУ иметь ту же строку с одинаковыми id link name (дата не имеет значения). Вот пример, который я не могу иметь:

 id |  link  |  name  |  date 
  1     aa       bob      1
  1     aa       bob      2

Я пытался:

ALTER TABLE table ADD UNIQUE KEY `uk_id_link_name` (id, link, name);

также:

ALTER TABLE `table` ADD UNIQUE `unique_index`(`id`, `link`, `name`);

Но это дает мне ошибку:

Повторяющаяся запись

Как сделать уникальные строки (комбинация значений столбцов, которые не являются уникальными)?

РЕДАКТИРОВАТЬ: Я не хочу удалять дубликаты из таблицы.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Правильный синтаксис для SQL Server должен быть следующим:

ALTER TABLE TableName ADD CONSTRAINT ConstraintName UNIQUE (id, link, name)

Но перед созданием ограничения, конечно, вы должны убедиться, что не существует строк, тормозящих ограничение, например, используя этот запрос:

SELECT id, link, name, COUNT(*)
FROM TableName
GROUP BY id, link, name
HAVING COUNT(*) >= 2

Этот запрос возвращает группировку дубликатов по трем полям: id, ссылка, имя

Если запрос возвращает строки, вы должны решить эти дубликаты, прежде чем создавать уникальное ограничение.

0 голосов
/ 06 ноября 2018

Ваша таблица уже нарушает уникальное ограничение. Поэтому вам нужно избавиться от оскорбительных значений.

Вы можете удалить все, кроме самой ранней даты:

delete t
    from t join
         (select id, link, name, min(date) as mindate
          from t
          group by id, link, name
         ) tt
         using (id, link, name)
    where date > mindate;

Когда данные совместимы, вы можете добавить уникальное ограничение.

Примечание: сделайте резервную копию / сделайте копию таблицы, прежде чем делать это, чтобы не потерять данные, которые вам могут действительно понадобиться.

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