MySQL 5.7 сгенерировал столбец DATE со ссылкой на TIMESTAMP

У меня есть столбец 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();
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
347
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать функцию DATE_FORMAT в NOW():

CREATE TABLE test(stamp DATE default (DATE_FORMAT(NOW(), '%Y-%m-%d')) NOT NULL);

Однако это не поддерживается в MySQL 5.7.

GMB 11.12.2020 14:58

@GMB Что именно не поддерживается? Спасибо!

Laurent Dhont 11.12.2020 15:00

Использование выражения по умолчанию не поддерживается в MySQL 5.7: dbfiddle.uk/…

GMB 11.12.2020 15:04

Да, я пробовал что-то подобное, но NOW() не поддерживается по умолчанию.

stschmitt 11.12.2020 16:08

@stschmitt Да, извини. Как объяснил GMB, выражения не поддерживаются в вашей версии mysql.

Laurent Dhont 11.12.2020 16:20
Ответ принят как подходящий

В 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 ;

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