powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Составные индексы MySQL
13 сообщений из 13, страница 1 из 1
Составные индексы MySQL
    #39946441
Serge00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
В таблице сложный первичный ключ из двух полей: id_1 и id_2.
Как мне сделать, чтобы после добавления 1,2 набор 2,1 был дубликатом?
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946446
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge00,

Версия MySQL какая?
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946451
Serge00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, 8.0.19
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946454
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне видится несколько путей:
1) при вставке данных триггером BEFORE менять данные местами так, чтобы в id_1 шло меньшее значение, а в id_2 - большее. Ну и обычный первичный/уникальный индекс на эти два поля.
2) Помимо двух исходных полей id_1 и id_2 сделать вычисляемые поля id_min и id_max, в которые помещать меньшее и большее значения соответственно. А уже на эти поля накладывать уникальный индекс.
3) Сразу создавать PRIMARY KEY (least(id_1,id_2), greatest(id_1,id_2)) - не уверен ,что так можно, но запрета в доке не вижу.
4) Констрейнтом CHECK разрешить вставку данных только тогда, когда id_1 <= id_2
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946486
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
Сразу создавать PRIMARY KEY (least(id_1,id_2), greatest(id_1,id_2)) - не уверен ,что так можно, но запрета в доке не вижу.

Нет, не получится. PRIMARY KEY не может включать вычисляемые виртуальные поля, явные или неявные.

А вот
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE test ( id_1 INT,
                    id_2 INT,
                    least_id INT AS (LEAST(id_1, id_2)) VIRTUAL,
                    greatest_id INT AS (GREATEST(id_1, id_2)) VIRTUAL,
                    UNIQUE (least_id, greatest_id)
                  );

вполне рабочий код.
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946503
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
miksoft
Сразу создавать PRIMARY KEY (least(id_1,id_2), greatest(id_1,id_2)) - не уверен ,что так можно, но запрета в доке не вижу.

Нет, не получится. PRIMARY KEY не может включать вычисляемые виртуальные поля, явные или неявные.

А вот
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE test ( id_1 INT,
                    id_2 INT,
                    least_id INT AS (LEAST(id_1, id_2)) VIRTUAL,
                    greatest_id INT AS (GREATEST(id_1, id_2)) VIRTUAL,
                    UNIQUE (least_id, greatest_id)
                  );


вполне рабочий код.
А совместить можно?
Код: sql
1.
2.
3.
4.
CREATE TABLE test ( id_1 INT,
                    id_2 INT,
                    UNIQUE (LEAST(id_1, id_2), GREATEST(id_1, id_2))
                  );
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946545
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
А совместить можно?

Нет.
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id_1, id_2), GREATEST(id_1, id_2)) )' at line 3
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946575
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
miksoft
А совместить можно?

Нет.
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id_1, id_2), GREATEST(id_1, id_2)) )' at line 3

А это на какой точно минорке? Мне проверить не на чем, но индексы по выражениям в 8.0.13 добавляли ( Functional Key Parts ). Может ещё комплект скобок нужен, как в примере с abs в доке?
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946577
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij
Может ещё комплект скобок нужен, как в примере с abs в доке?
Кстати, да.
Скобки неочевидные. В других СУБД я их не встречал в этой роли, а тут надо вчитаться в доку, чтобы понять, что они нужны.

Тогда так:
Код: sql
1.
2.
3.
4.
CREATE TABLE test ( id_1 INT,
                    id_2 INT,
                    UNIQUE ((LEAST(id_1, id_2)), (GREATEST(id_1, id_2)))
                  );
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946580
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
Тогда так:
О! а вот так - работает. Убиццо...
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946582
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
miksoft
Тогда так:
О! а вот так - работает. Убиццо...
А может так и PRIMARY KEY заработает?
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946599
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
может так и PRIMARY KEY заработает?
Не, не должен...

Не, не работает.
ERROR 3756 (HY000): The primary key cannot be a functional index
Первичному индексу нужно статическое поле.
...
Рейтинг: 0 / 0
Составные индексы MySQL
    #39946659
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вроде бы как по идеологии Primary должен быть таким...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Составные индексы MySQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]