|
Как обеспечить уникальность значений в 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
|
||||
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)
Реальные колонки и таблицы называются совсем не так. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |