Столбец TINYINT и использование в предложении Where - неожиданное поведение

Я хочу иметь контроль, чтобы временно скрыть некоторые продукты на веб-сайте. Я думал, что легче внести изменения в базу данных, чем изменить sql и снова загрузить страницу.

Я добавил новый столбец:

ALTER TABLE product ADD hide BINARY NULL;

Он создал столбец TINYINT(1). Если я сделаю несколько продуктов 1, чтобы скрыть, а затем снова сделать некоторые из них 0, чтобы показать, у меня будет таблица со столбцом скрытия, например:

*hide*
NULL
0
1

Когда я запрашиваю по:

SELECT * FROM product WHERE hide <> 1;

он показывает только 0, но не NULL. Когда я изменил столбец на BIT, он превратился в BIT(1), тот же запрос приводит к тому же.

Логически, если что-то определено как 0 или 1, другого варианта нет. Вот почему вы используете бинарный. Третий вариант не логичен.

Чтобы соответствовать определениям, единственный способ написать, как показано ниже?

SELECT * FROM product WHERE hide <> 1 OR hide IS NULL;

(используя MySQL 5.6.17)

Вопрос-2: Как вы временно скрываете товар? По-другому?

2 ответа

Я думаю, что MySQL будет искать строку, которая имеет значение сначала, а затем само значение, поэтому нулевое значение не будет показано.

Но если значение пустое, строка будет показана.

Поскольку продукт может быть либо скрытым, либо не скрытым, я бы предложил изменить определение поля и заставить NOT NULL ограничение на это.

Как указано здесь:

Во-первых, уберите все текущие значения NULL:

UPDATE `product` SET `hide`=0 WHERE `hide` IS NULL

Затем обновите определение таблицы, чтобы запретить значения NULL:

ALTER TABLE `product` ALTER COLUMN `hide` TINYINT NOT NULL

Если по какой-то причине вы действительно хотите сохранить значения NULL, вам нужно изменить свой запрос на вторую предоставленную вами версию.

Тем не менее, я не буду использовать подход базы данных на "временном" шкуре. Для таких случаев, я думаю, было бы лучше скрыть продукты на уровне приложений.

Другие вопросы по тегам