#mysql #sql #alter-table #date-arithmetic #sql-null
#mysql #sql #alter-table #дата-арифметика #sql-null
Вопрос:
при создании таблицы я забыл добавить столбец даты рождения. Есть ли способ добавить столбец NOT NULL в таблицу со значением по умолчанию, равным текущей дате?
Ответ №1:
Вы можете использовать alter table
. В MySQL 8.0:
alter table mytable
add datetime_of_birth datetime
not null
default (current_date);
Однако в более ранних версиях вы не можете иметь date
столбец, значение которого по умолчанию current_date
равно . Эта функция поддерживается только для datetime
столбцов s a и timestamp
s. Если вы можете работать со datetime
столбцом, то:
alter table mytable
add datetime_of_birth datetime
not null
default current_timestamp;
Затем вы можете игнорировать временную часть столбца при его запросе. Если это неприемлемое решение, то вам необходимо реализовать логику с помощью триггера.
Ответ №2:
Использовать alter table
:
alter table t add column date_of_birth date;
Комментарии:
1. мне нужно, чтобы столбец не имел нулевых значений
Ответ №3:
Если в вашей таблице есть строки данных, вы должны либо добавить столбец как nullable, либо присвоить ему значение ПО УМОЛЧАНИЮ, которое будет назначаться для каждой строки.
Если вы не зададите значение ПО УМОЛЧАНИЮ, то столбец NOT NULL попытается добавить значение «по умолчанию по умолчанию». Значение по умолчанию для даты '0000-00-00'
— это недопустимая дата, и она будет отклонена, если у вас установлен строгий режим (который я рекомендую):
mysql> create table mytable (id int primary key );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into mytable values (1);
Query OK, 1 row affected (0.01 sec)
mysql> alter table mytable add column date_of_birth date not null;
ERROR 1292 (22007): Incorrect date value: '0000-00-00' for column 'date_of_birth' at row 1
Типам данных DATETIME или TIMESTAMP по умолчанию может быть присвоено значение CURRENT_TIMESTAMP:
mysql> alter table mytable add column date_of_birth datetime not null default current_timestamp;
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0
Но вы сказали, что хотите столбец с ДАТОЙ, что не позволяет этого:
mysql> alter table mytable add column date_of_birth date not null default current_timestamp;
ERROR 1067 (42000): Invalid default value for 'date_of_birth'
В MySQL 8.0 вы можете использовать выражения по умолчанию (обратите внимание на дополнительные круглые скобки вокруг выражения, которые обязательны):
mysql> alter table mytable add column date_of_birth date not null default (curdate());
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0
Если вы используете более раннюю версию MySQL, то вы не можете сделать это в одной таблице ALTER. Сначала вы должны добавить столбец как столбец с нулевым значением, затем использовать UPDATE для заполнения значений во все существующие строки, затем снова ИЗМЕНИТЬ ТАБЛИЦУ, чтобы изменить столбец, чтобы он НЕ был НУЛЕВЫМ.