Имя: Пароль:
IT
Админ
Как обеспечить уникальность значений в MySQL?
,
0 Ванпанчмен
 
24.04.19
21:29
В таблице есть колонка `postavschik` и колонка `unikalnyj`

Если в колонке `unikalnyj` стоит значение 1, то соответствующее значение в колонке `postavschik` не должно повторяться. Иначе можно.

Как обеспечить контроль этого на уровне базы данных при добавлении новых значений и при изменении существующих?
1 Рэйв
 
24.04.19
21:35
Ты еще не знаешь о блокировках, мой юный падаван...
2 Сияющий в темноте
 
24.04.19
21:43
begin transaction
select count(*)
if exists fail
insert
commit transaction
3 Fram
 
24.04.19
22:09
на лицо ошибка проектирования реляционной базы данных
4 Ванпанчмен
 
24.04.19
22:19
(1) Почему так думаешь?
5 Ванпанчмен
 
24.04.19
22:20
(2) Что за fail ? Такая команда есть в MySQL? Не нашел что-то.
6 Garykom
 
гуру
24.04.19
22:21
(0) Ты издеваешься? Какой дебил использует транслит когда нельзя кириллицу?
Делай нормальные названия полей, ты же в Бостоне и явно там не на русском вокруг общаются.
7 Ванпанчмен
 
24.04.19
22:22
(6) Это просто пример, чтобы вам было понятнее.
8 Garykom
 
гуру
24.04.19
22:22
Короче кто то походу втирал что он веб-разработчик, потому что нубский тупой вопрос.

Не знать про mysql что это такое и с чем едят это не пипец это хуже.
9 Ванпанчмен
 
24.04.19
22:23
(6) >> и явно там не на русском вокруг общаются.

Аххаахаха! Как ты сильно ошибаешься
10 Garykom
 
гуру
24.04.19
22:23
11 Garykom
 
гуру
24.04.19
22:24
(9) Ты в РФ нашел на просторах деревню/село с названием "Бостон" ?
12 Ванпанчмен
 
24.04.19
22:24
(8) ты сам не знаешь ответа на мой вопрос, а что-то пытаешься из себя строить
13 Ванпанчмен
 
24.04.19
22:24
(11) не мечтай. Я в настоящем американском бостоне.
14 Garykom
 
гуру
24.04.19
22:30
(12) Ты на кого батон крошишь?

https://i.paste.pics/2d3c26b51273fbd3f897d8a0fcc02eec.png
15 Ванпанчмен
 
24.04.19
22:35
(14) Мы и в первый раз по (10) поняли что твой уровень знаний этим ограничивается. Можешь не продолжать.

(2) Хотябы понял суть вопроса. Учись.
16 Garykom
 
гуру
24.04.19
22:42
(15) Ты действительно не понял или прикалываешься?
Для mysql/mariadb можно задать контроль уникальности ключа на несколько полей.

http://fkn.ktu10.com/?q=node/9189
17 Ванпанчмен
 
24.04.19
22:43
(2) Фейлю операцию в триггере через такую конструкцию:

SIGNAL SQLSTATE '23000'
SET MYSQL_ERRNO = 1062,
TABLE_NAME = 'postavschiki',
MESSAGE_TEXT = "Duplicate entry 'Главспирттрест' for key 'postavschik'";

Но проблема в том что эта ошибка не перехватывается через ON DUPLICATE KEY UPDATE, а очень хотелось бы чтобы перехватывалась.
Как решить вопрос, кто знает?
18 Ванпанчмен
 
24.04.19
22:44
(16) смотри (15)
19 Garykom
 
гуру
24.04.19
22:44
(18) "Если в колонке `unikalnyj` стоит значение 1, то соответствующее значение в колонке `postavschik` не должно повторяться. Иначе можно."

твои слова?
20 Garykom
 
гуру
24.04.19
22:45
(19)+ кто тебе мешает для повторяющихся `postavschik` делать разные уникальные `unikalnyj` отличные от 1 ?
21 Ванпанчмен
 
24.04.19
22:45
(19) Прочитай еще раз мои слова, дружище. Ты вопрос видишь, но не понимаешь.
22 Ванпанчмен
 
24.04.19
22:49
(20) Там либо 1 либо 0, по условию. Можно доп колонку создать, но это костыли
23 Garykom
 
гуру
24.04.19
22:50
(22) Я не вижу в твоем условии в (0) "Там либо 1 либо 0, по условию"

Только "Если в колонке `unikalnyj` стоит значение 1"
24 Ванпанчмен
 
24.04.19
22:50
(23) Пусть будет так
25 Garykom
 
гуру
24.04.19
22:52
Наоборот удобно что каждый поставщик имеет свой номер в таблице неуникальности, чтобы знать насколько он не уникален ))
26 Ванпанчмен
 
24.04.19
23:13
Короче, сам придумал как сделать через генерируемую виртуальную колонку.

Потом на нее повесил уникальный вторичный индекс, и готово.

ALTER TABLE `postavschiki`
ADD COLUMN `unikalnyj_postavschik` VARCHAR(200) AS (IF(`unikalnyj`, `postavschik`, NULL)) VIRTUAL;
27 Garykom
 
гуру
24.04.19
23:21
(26) Эээ а вьюх там в mysql еще нет? Просто я ее изучал плотно еще 10 лет назад и потом почти не работал?
28 Garykom
 
гуру
24.04.19
23:24
(27)+ Прикольно есть еще с 5-й версии.
29 Сияющий в темноте
 
25.04.19
00:10
(17)если в таблице есть уникальная колонка,то просто пиши а нее неуникальное значение и будет тебе on duplicate key,
уникальное значение можно через select min выбрать.
30 Ванпанчмен
 
25.04.19
00:14
(29) +1
Шаришь
31 Ванпанчмен
 
25.04.19
00:16
+(26) На продакшн сервере оказалась старая версия Марии, не поддерживает индексы на виртуальных колонках. Сделал на хранимых, но суть та же:

ALTER TABLE `postavschiki`
ADD COLUMN `unikalnyj_postavschik` VARCHAR(200) AS (IF(`unikalnyj`, `postavschik`, NULL)) PERSISTENT UNIQUE;
32 Ванпанчмен
 
25.04.19
00:17
С триггером думаю будет медленнее работать, так что забил на него.
33 Сияющий в темноте
 
25.04.19
00:19
а null разве проверку уникальности исключает?
или это только FireBird такого мнения?
34 Ванпанчмен
 
25.04.19
16:55
(33) Исключает. NULL не сравнивается
35 VladZ
 
25.04.19
17:15
(0) postavschik и unikalnyj...  Прям как в лихие 90е... Пришел какой-то буржуйский язык программирования. А ты в нем дуб дубом... И пишешь postavschik и unikalnyj...
36 1Сергей
 
25.04.19
17:20
(35) филенаме
37 Garykom
 
гуру
25.04.19
18:23
(35) Меня это сразу царапнуло, ну не может человек с опытом да еще пишущий в США так делать
38 Garykom
 
гуру
25.04.19
18:24
supplier и unique еще куда ни шло
39 Garykom
 
гуру
25.04.19
18:25
Сейчас многие базы позволяют UTF в именах полей, но для продакшена это лучше не делать.
40 zehn
 
25.04.19
19:07
(0)> колонка `postavschik` и колонка `unikalnyj`
оХГДЕЖ йЮЙНИ, йоб абортед.
Задорнов был бы рад.
41 Ванпанчмен
 
25.04.19
21:42
(37) См (7)
Реальные колонки и таблицы называются совсем не так.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn