Вход | Регистрация
 
Информационные технологии :: Администрирование

Как обеспечить уникальность значений в MySQL?

Как обеспечить уникальность значений в MySQL?
Я
   Ванпанчмен
 
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
   Fram
 
3 - 24.04.19 - 22:09
на лицо ошибка проектирования реляционной базы данных
   Ванпанчмен
 
4 - 24.04.19 - 22:19
(1) Почему так думаешь?
   Ванпанчмен
 
5 - 24.04.19 - 22:20
(2) Что за fail ? Такая команда есть в MySQL? Не нашел что-то.
   Garykom
 
6 - 24.04.19 - 22:21
(0) Ты издеваешься? Какой дебил использует транслит когда нельзя кириллицу?
Делай нормальные названия полей, ты же в Бостоне и явно там не на русском вокруг общаются.
   Ванпанчмен
 
7 - 24.04.19 - 22:22
(6) Это просто пример, чтобы вам было понятнее.
   Garykom
 
8 - 24.04.19 - 22:22
Короче кто то походу втирал что он веб-разработчик, потому что нубский тупой вопрос.

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

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

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

(2) Хотябы понял суть вопроса. Учись.
   Garykom
 
16 - 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)
   Garykom
 
19 - 24.04.19 - 22:44
(18) "Если в колонке `unikalnyj` стоит значение 1, то соответствующее значение в колонке `postavschik` не должно повторяться. Иначе можно."

твои слова?
   Garykom
 
20 - 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, по условию. Можно доп колонку создать, но это костыли
   Garykom
 
23 - 24.04.19 - 22:50
(22) Я не вижу в твоем условии в (0) "Там либо 1 либо 0, по условию"

Только "Если в колонке `unikalnyj` стоит значение 1"
   Ванпанчмен
 
24 - 24.04.19 - 22:50
(23) Пусть будет так
   Garykom
 
25 - 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;
   Garykom
 
27 - 24.04.19 - 23:21
(26) Эээ а вьюх там в mysql еще нет? Просто я ее изучал плотно еще 10 лет назад и потом почти не работал?
   Garykom
 
28 - 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 не сравнивается
   VladZ
 
35 - 25.04.19 - 17:15
(0) postavschik и unikalnyj...  Прям как в лихие 90е... Пришел какой-то буржуйский язык программирования. А ты в нем дуб дубом... И пишешь postavschik и unikalnyj...
   1Сергей
 
36 - 25.04.19 - 17:20
(35) филенаме
   Garykom
 
37 - 25.04.19 - 18:23
(35) Меня это сразу царапнуло, ну не может человек с опытом да еще пишущий в США так делать
   Garykom
 
38 - 25.04.19 - 18:24
supplier и unique еще куда ни шло
   Garykom
 
39 - 25.04.19 - 18:25
Сейчас многие базы позволяют UTF в именах полей, но для продакшена это лучше не делать.
   zehn
 
40 - 25.04.19 - 19:07
(0)> колонка `postavschik` и колонка `unikalnyj`
оХГДЕЖ йЮЙНИ, йоб абортед.
Задорнов был бы рад.
   Ванпанчмен
 
41 - 25.04.19 - 21:42
(37) См (7)
Реальные колонки и таблицы называются совсем не так.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует