|
Использовать корректно CASE внутри CHECK
|
|||
---|---|---|---|
#18+
Имеется таблица 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'. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 13:34 |
|
Использовать корректно CASE внутри CHECK
|
|||
---|---|---|---|
#18+
dr.cary `filial_1` is true Попробуйте так: Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 14:04 |
|
Использовать корректно CASE внутри CHECK
|
|||
---|---|---|---|
#18+
miksoft dr.cary `filial_1` is true [/src] filial_1 Это булево поле.Я пытался проверить его на истина/ложь ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 14:41 |
|
Использовать корректно CASE внутри CHECK
|
|||
---|---|---|---|
#18+
[quot miksoft#22239326] dr.cary Попробуйте так: Код: sql 1. 2. 3. 4. 5. 6.
Скрипт работает, я только не совсем понял как его интерпретирует ядро СУБД. Проверить `last_filial` = 'filial_1' и.. а дальше как воспринимает ядро этот скрипт? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 14:42 |
|
Использовать корректно CASE внутри CHECK
|
|||
---|---|---|---|
#18+
dr.cary, Это просто выражение, которое вычисляется. Если оно в итоге дает истину, то запись проверку проходит. Иначе - не проходит. Кстати, в MySQL нет булевского типа. Истина - это 1, ложь - это 0. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 15:13 |
|
Использовать корректно CASE внутри CHECK
|
|||
---|---|---|---|
#18+
miksoft dr.cary, Кстати, в MySQL нет булевского типа. Истина - это 1, ложь - это 0. Да, там идет имитация через: TINYINT ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 15:21 |
|
Использовать корректно CASE внутри CHECK
|
|||
---|---|---|---|
#18+
miksoft dr.cary `filial_1` is true Попробуйте так: Код: sql 1. 2. 3. 4. 5. 6.
В этой части скрипта |`last_filial` = 'filial_1'... | явно указанно что столбец `last_filial` должен быть равен 'filial_1' а в этой части |..... AND `filial_1`......| где инструкция для ядра о том что filial_1 должен быть заполнен '1'? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 15:26 |
|
Использовать корректно CASE внутри CHECK
|
|||
---|---|---|---|
#18+
dr.cary, Я не понимаю вопрос, да еще в такой странной терминологии (это не скрипт, не инструкция и не ядро). Это выражение, которое MySQL вычисляет для каждой вставляемой или обновляемой записи таблицы. Если результат выражения истина (т.е. 1), то запись будет вставлена/обновлена. Если результат выражения ложь (т.е. 0), то запись не будет вставлена/обновлена. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 15:50 |
|
Использовать корректно CASE внутри CHECK
|
|||
---|---|---|---|
#18+
miksoft dr.cary, Если результат выражения истина (т.е. 1), то запись будет вставлена/обновлена. Если результат выражения ложь (т.е. 0), то запись не будет вставлена/обновлена. Просто в коде отсутствует явное указания типа <>0 или is true. Поэтому я не совсем пойму как он работает! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 19:33 |
|
|
start [/forum/topic.php?fid=47&fpage=14&tid=1828292]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 243ms |
total: | 360ms |
0 / 0 |