Блокировка «0000-00-00» из полей даты MySQL - PullRequest
10 голосов
/ 08 октября 2010

У меня есть база данных, где старый код любит вставлять «0000-00-00» в столбцы Date и DateTime вместо реальной даты.Итак, у меня есть два следующих вопроса:

  1. Могу ли я что-нибудь сделать на уровне БД, чтобы заблокировать это?Я знаю, что могу установить столбец не равным NULL, но, похоже, это не блокирует эти нулевые значения.
  2. Как лучше всего определить существующие нулевые значения в полях даты?У меня есть около ста таблиц с 2-3 столбцами даты в каждой, и я не хочу запрашивать их отдельно.

Продолжение:

По умолчаниюуже установлен в ноль.Давным-давно по умолчанию было «0000-00-00».Некоторый код все еще явно помещает «0000-00-00».Я бы предпочел заставить этот код выдавать ошибку, чтобы я мог ее изолировать и удалить.

Ответы [ 7 ]

12 голосов
/ 08 октября 2010

Есть ли что-нибудь, что я мог бы сделать на уровне БД, чтобы заблокировать это?

Да, включить режим NO_ZERO_DATE:

SET sql_mode = 'NO_ZERO_DATE';

поведение задокументировано .Кроме того, вы можете также включить режим NO_ZERO_IN_DATE ...

Также убедитесь, что sql_mode включает либо STRICT_ALL_TABLES, либо STRICT_TRANS_TABLES;без них NO_ZERO_IN_DATE только выдает предупреждение, но вставка все равно завершается успешно.

Каков наилучший способ обнаружить существующие нулевые значения в полях даты?У меня есть около ста таблиц с 2-3 столбцами даты в каждой, и я не хочу запрашивать их по отдельности.

Отдельные столбцы означают, что их нужно проверять по отдельности - с этим ничего не поделаешь,

0 голосов
/ 21 августа 2014

Это триггер, который я использую:

delimiter //
CREATE TRIGGER bad_date BEFORE INSERT ON some_table
    FOR EACH ROW
        BEGIN
            IF NEW.the_date='0000-00-00' THEN 
                SET NEW.the_date= CURDATE();
            END IF;
        END;//

Если обновления являются проблемой, добавьте отдельный триггер (ДО ОБНОВЛЕНИЯ), чтобы сделать то же самое.

0 голосов
/ 20 мая 2014

установить временную метку по умолчанию, возможно, вам подойдет, используйте для этого инструкцию изменения таблицы:

ALTER TABLE mytable CHANGE date_update timestamp NOT NULL DEFAULT CURRENT_DATE()

Документация MySQL CURRENT_DATE () на ресурсе w3c

Чтобы удалить нулевые даты и заменить их, например, на текущую дату, сделайте следующее:

UPDATE mytable SET date_update = CURRENT_DATE() where date_update = "0000-00-00"
0 голосов
/ 08 октября 2010

A триггер может использоваться для принудительного применения значений для столбцов.

0 голосов
/ 08 октября 2010

Если вы не можете легко исправить данные и "SET sql_mode = 'NO_ZERO_DATE';", вы можете создать представление для таблицы ...

CREATE VIEW filter AS
SELECT other_column, 
CASE 
  WHEN realtable.dodgy_date = 0 THEN NULL 
  ELSE realtable.dodgy_date
END AS dodgy_date
FROM realtable;
0 голосов
/ 08 октября 2010

Вы можете сделать столбцы обнуляемыми и иметь NULL в качестве значения по умолчанию, но, похоже, у вас это уже есть, и оно не работает. ХОТЯ ... это может быть инструмент, который вы используете для отображения данных, не нравится отображение NULL дат ... какой инструмент вы используете? Или «0000-00-00» отображается в данных, полученных с помощью кода?

Вы можете установить значение по умолчанию, которое является ненулевым, а также легко распознаваемым как значение по умолчанию, например 1900-01-01 (при условии, что вы обычно не имеете дело с датами, близкими к этой дате).

0 голосов
/ 08 октября 2010

Если не имеет значения, какая дата там указана (то есть, если она не равна нулю), вы можете изменить определение столбца, чтобы использовать NOW () по умолчанию.Возможно, это не идеальное решение, но оно удовлетворяет критериям: 1) Не нулевое 2) Не нулевое Я на самом деле действительно не горжусь этим предложением

...