SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.05.2014 15:14:07

Cheb
Завсегдатай
Зарегистрирован: 27.12.2013
Сообщений: 28

поле ENUM.

создал таблицу


CREATE TABLE  link_day_columns
(id_columns INTEGER NOT NULL,
day_week ENUM ('Пн','Вт','Ср','Чт','Пт','Сб','Вс') NOT NULL,
PRIMARY KEY (id_columns, day_week));
 


Заполняю


INSERT INTO link_day_columns VALUES (0 , 'Пн');
INSERT INTO link_day_columns VALUES (0 , 'Вт');
 


все хорошо, но вот если так попробовать, вместо определенных в поле типа Enum значений, написать что попало :

INSERT INTO link_day_columns VALUES (0 , 'Хх');
 


Получаю результат:

+------------+----------+
| id_columns | day_week |
+------------+----------+
|          0 |          |
|          0 | Пн       |
|          0 | Вт       |
+------------+----------+
 


Вопрос как сделать так, чтобы попытка добавить такое непредусмотренное значение не прокатывала?
То есть я думал, что не должно быть добавленно такое значение, которого нет в описании поля, когда создавали таблицу

Отредактированно Cheb (22.05.2014 15:16:35)

Неактивен

 

#2 22.05.2014 15:34:47

Cheb
Завсегдатай
Зарегистрирован: 27.12.2013
Сообщений: 28

Re: поле ENUM.

я вот тут почитал

можно решить частично тем, что обращаться к таблице специальным запросом и отфильтровать такие строки

SELECT * FROM link_day_columns WHERE not(day_week = 0);

тогда мы их не увидим, НО...
все таки хотелось бы повысить надежность и сделать так , что бы добавить их было невозможно, вдруг , коллега забудет про этот факт и будет дергать из этой таблицы данные обычным запросом.

Отредактированно Cheb (22.05.2014 15:37:03)

Неактивен

 

#3 22.05.2014 15:39:36

Cheb
Завсегдатай
Зарегистрирован: 27.12.2013
Сообщений: 28

Re: поле ENUM.

То есть отсюда получается правило:
"всегда к таким полям обращаться с использованием

WHERE not (field = 0)
"

Так? Да?

Отредактированно Cheb (22.05.2014 15:41:44)

Неактивен

 

#4 22.05.2014 19:28:35

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: поле ENUM.

set @sql_mode='strict';
(или аналогичная глобальная переменная)
и тогда нельзя будет вставить некорректное значение в ENUM

Неактивен

 

#5 23.05.2014 09:58:16

Cheb
Завсегдатай
Зарегистрирован: 27.12.2013
Сообщений: 28

Re: поле ENUM.

делаем так, но таблицу надо удалить перед этим (!!!)

mysql> SET GLOBAL sql_mode = 'STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)


перезапускаем, проверяем настройки и видим , что режим включен
mysql> SELECT @@sql_mode\G
*************************** 1. row ***************************
@@sql_mode: STRICT_ALL_TABLES
1 row in set (0.00 sec)


а дальше создаем таблицу с полем ENUM

и добавляем данные
mysql> insert into link_day_columns values (1, 'Пн');
Query OK, 1 row affected (0.05 sec)


mysql> insert into link_day_columns values (1, 'Xx');
ERROR 1265 (01000): Data truncated for column 'day_week' at row 1


Что и требовалось получить.

смотрим ошибку
mysql> show WARNINGS;
+-------+------+-----------------------------------------------+
| Level | Code | Message                                       |
+-------+------+-----------------------------------------------+
| Error | 1265 | Data truncated for column 'day_week' at row 1 |
+-------+------+-----------------------------------------------+
1 row in set (0.00 sec)
 


читать тут cool

Отредактированно Cheb (23.05.2014 11:03:04)

Неактивен

 

#6 23.05.2014 12:29:51

Cheb
Завсегдатай
Зарегистрирован: 27.12.2013
Сообщений: 28

Re: поле ENUM.

Хотя я написал, что

SET GLOBAL sql_mode = 'STRICT_ALL_TABLES';

перезапускаем, проверяем настройки и видим , что режим включен
mysql> SELECT @@sql_mode\G
*************************** 1. row ***************************
@@sql_mode: STRICT_ALL_TABLES
1 row in set (0.00 sec)

однако я не проверил. И перезагрузившись, увидел , что настройка STRICT_ALL_TABLES не сохранилась.
Жаль. Надо разобраться, как сделать так, чтоб сохранялась. Но это уже другая тема. Если кто знает, сообщите

Неактивен

 

#7 23.05.2014 12:45:55

Cheb
Завсегдатай
Зарегистрирован: 27.12.2013
Сообщений: 28

Re: поле ENUM.

Неактивен

 

#8 23.05.2014 13:41:03

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: поле ENUM.

Настройку sql_mode нужно прописать в конфигурационный файл my.cnf.

Неактивен

 

#9 23.05.2014 14:54:22

Cheb
Завсегдатай
Зарегистрирован: 27.12.2013
Сообщений: 28

Re: поле ENUM.

да-да прописал уже. спасибо всем

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson