Измените значение столбца по умолчанию на выражение

Я пытаюсь изменить существующее значение по умолчанию для столбцов с «никакого значения по умолчанию» на «завтрашнюю дату» на стороне СУБД.


Более конкретно:

Вставляя строку данных в мою таблицу, я хочу по умолчанию иметь дату завтрашнего дня в столбце (по метке времени вставки).

Используемые инструменты:

  • MariaDB v15.1 для debian-linux-gnu (я использую CLI 'MariaDB следить за моими операциями)
  • Debian GNU / Linux 9 (stretch) как виртуальный сервер в дата-центре
  • шпатлевка v0.65 с трансмиссией UTF-8

Мой общая SQL-команда для инициирования изменения моего столбца:

ALTER TABLE test
    CHANGE COLUMN tomorrow
        tomorrow date not null default (EVIL-EXPRESSION);

'ЗЛО-ВЫРАЖЕНИЕ' в приведенном выше примере кода - это просто заполнитель для следующего возможности:

default (date_add(curdate(), interval 1 day))

или

default (adddate(current_date(), 1))

или

default (now() + interval 1 day)

или

default (today + interval 1 day)
# today is a column declared before actual column 'tomorrow'

И некоторые другие варианты / псевдонимы с тем же результатом кода ошибки:

ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version
for the right syntax to use near '(date_add(curdate(), interval 1 day))'
at line 1

Из-за ошибки этот номер ошибки «1064 (42000)» указывает на несоответствие скобок. Я почти уверен, что здесь дело обстоит не так. А когда он есть, тогда мне определенно нужны каникулы. ;)


Из-за официальная документация MariaDB выражения разрешены в операторе по умолчанию, начиная с версии 10.2+.

Также Эта статья восторгается этой функцией - с неработающим для меня примером (с оператором alter table). Прокрутите вниз до раздела "Пункт" ПО УМОЛЧАНИЮ ".

В моей ошибке нельзя винить даже злых персонажей, таких как этот гений указал.


Может, баг MariaDB?

И, конечно же, я могу и на самом деле могу найти обходной путь для PHP-скрипта на сервере без каких-либо значений по умолчанию. Но мне все еще интересно передать его в базу данных для большего удобства - универсальное обслуживание. ;)

Я благодарен за каждый вклад, так что пусть начнется мозговой штурм - мой мозг курит. ;)

1
0
1 901
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, это ваша ошибка: и вам не хватает парантезиса:

default (adddate(current_date(), 1)

Посчитайте их: вы открываете 3 и закрываете только 2 !!!!

Спасибо, Симион, да, ты прав. В моем посте выше их много. Но на моем сервере их нет - пока что недостаточная концентрация. Чтобы быть на 100% уверенным, я просто попробовал некоторые возможности с дополнительным вниманием к скобкам и все той же ошибкой. Исправлю свой пост.

Robert Jaskowski 10.08.2018 16:49
Ответ принят как подходящий

Проверьте СОЗДАТЬ ТАБЛИЦУ :: ПО УМОЛЧАНИЮ. Проверьте свою версию MariaDB.

Контрольная работа:

MariaDB [_]> SELECT VERSION();
+-------------------------+
| VERSION()               |
+-------------------------+
| 10.3.8-MariaDB-1:10.3.8 |
+-------------------------+
1 row in set (0.000 sec)

MariaDB [_]> DROP TABLE IF EXISTS `test`;
Query OK, 0 rows affected (0.001 sec)

MariaDB [_]> CREATE TABLE IF NOT EXISTS `test` (
    ->   `id` SERIAL,
    ->   `today` DATE NOT NULL DEFAULT CURRENT_DATE,
    ->   `tomorrow` DATE
    -> );
Query OK, 0 rows affected (0.001 sec)

MariaDB [_]> DESC `test`\G
*************************** 1. row ***************************
  Field: id
   Type: bigint(20) unsigned
   Null: NO
    Key: PRI
Default: NULL
  Extra: auto_increment
*************************** 2. row ***************************
  Field: today
   Type: date
   Null: NO
    Key: 
Default: curdate()
  Extra: 
*************************** 3. row ***************************
  Field: tomorrow
   Type: date
   Null: YES
    Key: 
Default: NULL
  Extra: 
3 rows in set (0.001 sec)

MariaDB [_]> ALTER TABLE `test`
    ->   CHANGE COLUMN `tomorrow`
    ->   `tomorrow` DATE NOT NULL DEFAULT (`today` + INTERVAL 1 DAY);
Query OK, 0 rows affected (0.004 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [_]> DESC `test`\G
*************************** 1. row ***************************
  Field: id
   Type: bigint(20) unsigned
   Null: NO
    Key: PRI
Default: NULL
  Extra: auto_increment
*************************** 2. row ***************************
  Field: today
   Type: date
   Null: NO
    Key: 
Default: curdate()
  Extra: 
*************************** 3. row ***************************
  Field: tomorrow
   Type: date
   Null: NO
    Key: 
Default: (`today` + interval 1 day)
  Extra: 
3 rows in set (0.001 sec)

MariaDB [_]> INSERT INTO `test` (`id`) SELECT NULL;
Query OK, 1 row affected (0.000 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [_]> SELECT
    ->   `id`,
    ->   `today`,
    ->   `tomorrow`
    -> FROM
    ->   `test`;
+----+------------+------------+
| id | today      | tomorrow   |
+----+------------+------------+
|  1 | 2000-01-01 | 2000-01-02 |
+----+------------+------------+
1 row in set (0.000 sec)

Да! Моя версия MariaDB была 10.1.26 (или похожей). Похоже, я прочитал неправильное название версии из вывода "mariadb --version". Установил MariaDB 10.3.8 и теперь работает нормально. Спасибо @wchiquito!

Robert Jaskowski 10.08.2018 23:20

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