У меня есть столбец created_at
в таблице, и я хочу добавить столбец created_at_day
с типом DATE
.
Столбец created_at_day
должен инициализироваться текущей датой.
Я пытался сделать это с помощью сгенерированного столбца, так как нет DEFAULT CURRENT DATE
или чего-то подобного.
Проблема в том, что при вставке новой записи я получаю сообщение об ошибке:Error executing INSERT statement. Data truncation: Incorrect date value: '0000-00-00' for column 'created_at_day' at row 1 - Connection: Localhost: 48ms
Я нашел два возможных решения, оба из которых имеют недостатки.
Один из них — заменить TIMESTAMP
на DATETIME
. По какой-то причине столбец DATETIME
с DEFAULT CURRENT_TIMESTAMP
работает, но я бы предпочел не менять каждый из моих столбцов TIMESTAMP
на DATETIME
.
Еще одна вещь, которая работает, — это отключить NO_ZERO_DATE
в режиме SQL. По какой-то причине, когда я отключаю это, столбец даты даже инициализируется правильным значением, а не 0000-00-00
. Но это похоже на обходной путь, а не на решение, и может привести к проблемам в будущем.
Есть ли другой простой способ создать столбец DATE
, который инициализируется текущей датой?
Вот пример кода, который выдает ошибку:
create table test(
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_at_day DATE AS (DATE(created_at))
);
insert into test values();
Вы можете использовать функцию DATE_FORMAT в NOW():
CREATE TABLE test(stamp DATE default (DATE_FORMAT(NOW(), '%Y-%m-%d')) NOT NULL);
@GMB Что именно не поддерживается? Спасибо!
Использование выражения по умолчанию не поддерживается в MySQL 5.7: dbfiddle.uk/…
Да, я пробовал что-то подобное, но NOW() не поддерживается по умолчанию.
@stschmitt Да, извини. Как объяснил GMB, выражения не поддерживаются в вашей версии mysql.
В MySQL 8.0 вы можете просто сделать:
create table test(
created_at_day date as (current_date)
);
Я не думаю, что в MySQL 5.7 это можно сделать только с помощью определения таблицы. Вам понадобится триггер:
create table test(
created_at_day date
);
delimiter //
create trigger trg_test_created_at_day
before insert on test
for each row
begin
if (new.created_at_day is null) then
set new.created_at_day = current_date;
end if;
end//
delimiter ;
Однако это не поддерживается в MySQL 5.7.