Столбец 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, вам нужно изменить свой запрос на вторую предоставленную вами версию.
Тем не менее, я не буду использовать подход базы данных на "временном" шкуре. Для таких случаев, я думаю, было бы лучше скрыть продукты на уровне приложений.