powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Использовать корректно CASE внутри CHECK
10 сообщений из 10, страница 1 из 1
Использовать корректно CASE внутри CHECK
    #40022758
dr.cary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется таблица product
id_product| name_product| last_filial| filial_1| filial_2| filial_3| filial_4|



CREATE TABLE `exp`.`product` (
`id_product` INT NOT NULL AUTO_INCREMENT,
`name_product` TEXT NOT NULL,
`last_filial` VARCHAR(45) NOT NULL,
`filial_1` TINYINT NOT NULL,
`filial_2` TINYINT NOT NULL,
`filial_3` TINYINT NOT NULL,
`filial_4` TINYINT NOT NULL,
PRIMARY KEY (`id_product`));
Которая описывает id продукта, наименование продукта, булева поля (filial_1-filial_4) которые описывают участвует филиал в изготовлении продукта или нет (в изготовлении продукта по технологии может участвовать от 1 до 4 филиалов последовательно, сама последовательность нам не интересна важен только факт участия) и поле last_filial в которое вносится последний по технологии филиал изготовитель.
Задача сделать проверку что бы по булеву полю филиала была обязательно внесена истина если этот филиал указан как конечный в поле last_filial .
У меня получился следующий скрипт:
alter table product
add CONSTRAINT `2` CHECK (
case
when `last_filial` = 'filial_1' then `filial_1` is true
when `last_filial` = 'filial_2' then `filial_2` is true
when `last_filial` = 'filial_3' then `filial_3` is true
when `last_filial` = 'filial_4' then `filial_4` is true
end);
на скрипт возвращается ошибка Error Code: 3812. An expression of non-boolean type specified to a check constraint '2'.
...
Рейтинг: 0 / 0
Использовать корректно CASE внутри CHECK
    #40022768
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.cary
`filial_1` is true
а что это за конструкция?

Попробуйте так:
Код: sql
1.
2.
3.
4.
5.
6.
CHECK (
 (`last_filial` = 'filial_1' AND `filial_1`) OR 
 (`last_filial` = 'filial_2' AND `filial_2`) OR 
 (`last_filial` = 'filial_3' AND `filial_3`) OR 
 (`last_filial` = 'filial_4' AND `filial_4`)
)
...
Рейтинг: 0 / 0
Использовать корректно CASE внутри CHECK
    #40022780
dr.cary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
dr.cary
`filial_1` is true
а что это за конструкция?

[/src]


filial_1 Это булево поле.Я пытался проверить его на истина/ложь
...
Рейтинг: 0 / 0
Использовать корректно CASE внутри CHECK
    #40022781
dr.cary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot miksoft#22239326]
dr.cary


Попробуйте так:
Код: sql
1.
2.
3.
4.
5.
6.
CHECK (
 (`last_filial` = 'filial_1' AND `filial_1`) OR 
 (`last_filial` = 'filial_2' AND `filial_2`) OR 
 (`last_filial` = 'filial_3' AND `filial_3`) OR 
 (`last_filial` = 'filial_4' AND `filial_4`)
)



Скрипт работает, я только не совсем понял как его интерпретирует ядро СУБД.
Проверить `last_filial` = 'filial_1' и.. а дальше как воспринимает ядро этот скрипт?
...
Рейтинг: 0 / 0
Использовать корректно CASE внутри CHECK
    #40022792
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.cary,

Это просто выражение, которое вычисляется.
Если оно в итоге дает истину, то запись проверку проходит. Иначе - не проходит.

Кстати, в MySQL нет булевского типа. Истина - это 1, ложь - это 0.
...
Рейтинг: 0 / 0
Использовать корректно CASE внутри CHECK
    #40022794
dr.cary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
dr.cary,


Кстати, в MySQL нет булевского типа. Истина - это 1, ложь - это 0.


Да, там идет имитация через:
TINYINT
...
Рейтинг: 0 / 0
Использовать корректно CASE внутри CHECK
    #40022795
dr.cary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
dr.cary
`filial_1` is true
а что это за конструкция?

Попробуйте так:
Код: sql
1.
2.
3.
4.
5.
6.
CHECK (
 (`last_filial` = 'filial_1' AND `filial_1`) OR 
 (`last_filial` = 'filial_2' AND `filial_2`) OR 
 (`last_filial` = 'filial_3' AND `filial_3`) OR 
 (`last_filial` = 'filial_4' AND `filial_4`)
)





В этой части скрипта |`last_filial` = 'filial_1'... | явно указанно что столбец `last_filial` должен быть равен 'filial_1'

а в этой части |..... AND `filial_1`......|
где инструкция для ядра о том что filial_1 должен быть заполнен '1'?
...
Рейтинг: 0 / 0
Использовать корректно CASE внутри CHECK
    #40022805
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.cary,

Я не понимаю вопрос, да еще в такой странной терминологии (это не скрипт, не инструкция и не ядро).
Это выражение, которое MySQL вычисляет для каждой вставляемой или обновляемой записи таблицы. Если результат выражения истина (т.е. 1), то запись будет вставлена/обновлена. Если результат выражения ложь (т.е. 0), то запись не будет вставлена/обновлена.
...
Рейтинг: 0 / 0
Использовать корректно CASE внутри CHECK
    #40022875
dr.cary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
dr.cary,
Если результат выражения истина (т.е. 1), то запись будет вставлена/обновлена. Если результат выражения ложь (т.е. 0), то запись не будет вставлена/обновлена.


Просто в коде отсутствует явное указания типа <>0 или is true.
Поэтому я не совсем пойму как он работает!
...
Рейтинг: 0 / 0
Использовать корректно CASE внутри CHECK
    #40022889
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.cary
я не совсем пойму как он работает

Какой результат даст (`last_filial` = 'filial_1' AND `filial_1`) - понятно?
Какой результат даст a OR b OR c OR d - понятно?
Зачем тут ЕЩЁ сравнение?
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Использовать корректно CASE внутри CHECK
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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