создать таблицу, в которой каждое значение может присутствовать не более одного раза - PullRequest
1 голос
/ 11 марта 2020

Скажем, у нас есть база данных пар лучших друзей (можно иметь только одного лучшего друга).

1,2
4,3
5,2 <-- 5 can't be best friends with 2, because 2 already is in a best-friend relationship. [INVALID]
2,1 <-- 1 and 2 is already present in the table, we don't want this redundancy. [INVALID]

Чтобы было ясно, действительна ли пара друзей, зависит от порядка вставки. Если мы получили порядок вставки:

2,1
4,3
1,2  <--- [INVALID] 1 and 2 is already recorded in the DB.

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

CREATE TABLE friends 
(
   ID_1 int UNIQUE,
   ID_2 int UNIQUE,
   PRIMARY KEY (ID_1, ID_2)
)

1 Ответ

1 голос
/ 11 марта 2020

Самые последние версии MySQL поддерживают индексы на основе функций :

MySQL 8.0.13 и более поздние версии поддерживают функциональные ключевые части, которые индексируют значения выражений, а не значения столбца или префикса столбца.

Вам нужен уникальный индекс наименьшего и наибольшего из значений:

create unique index unq_bestfriends_friend1_friend2
    on bestfriends(least(friend1, friend2), greatest(friend1, friend2));

Начиная с MySQL 5.7, вы можете сделать нечто подобное с вычисляемыми столбцами:

alter table bestfriends add least_friend int
    generated always as (least(friend1, friend2));

изменить таблицу лучших друзей добавить наибольший созданный всегда int как (наибольший (друг1, друг2));

create unique index unq_bestfriends_friend1_friend2
    on bestfriends(least_friend, greatest_friend);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...