MariaDB / MySql: установка CURRENT_TIMESTAMP на CREATE и изменение примечания на UPDATE - PullRequest
0 голосов
/ 24 января 2019

Я не использовал MySQL в течение нескольких лет, и когда я создал новую таблицу, она сделала то, чего я не ожидал.Я использую MariaDB v5.5.60-MariaDB

Мне нужно создать таблицу, в которой есть и столбец created, и столбец updated.

Мне нужностолбец created должен быть установлен в CURRENT_TIMESTAMP только при создании строки, а затем никогда не изменяться, если я не изменю ее явно.

Мне нужно, чтобы столбец updated был установлен в CURRENT_TIMESTAMP и при создании строкии когда строка изменяется.

Если я сделаю следующее:

CREATE TABLE user_prefs (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
  user VARCHAR(255) NOT NULL,
  provider VARCHAR(255) NOT NULL,
  pref VARCHAR(128) NOT NULL,
  jsondata LONGTEXT,
  created timestamp NOT NULL,
  modified timestamp NOT NULL,
  PRIMARY KEY (id),
  UNIQUE INDEX id_UNIQUE (id ASC));

Тогда для столбца created будет установлено значение:
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

и для столбца modified установлено значение:
DEFAULT '0000-00-00 00: 00: 00'

Если я попробую это:

CREATE TABLE user_prefs (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
  user VARCHAR(255) NOT NULL,
  provider VARCHAR(255) NOT NULL,
  pref VARCHAR(128) NOT NULL,
  jsondata LONGTEXT,
  created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  modified timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE INDEX id_UNIQUE (id ASC));

Тогда я получаю ошибку ** Код ошибки: 1293. Неверное определение таблицы;может быть только один столбец TIMESTAMP с CURRENT_TIMESTAMP в предложении DEFAULT или ON UPDATE **

. Существует ли способ автоматизировать установку как created, так и modified при создании строки, а затем изменить modified каждый раз, когда меняется строка?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Таблица может иметь автоматическую инициализацию даты только в одном столбце в старых версиях MySQL.Но его поведение исправлено в версии 5.6.5. Это означает, что у вас есть несколько способов избежать этой ошибки:

1.Вы можете обновить MySQL до последней версии;


Преимущества:

  • встроенная понятная реализация управления датами изменения на стороне базы данных
  • нет лишних триггеров

Обратный просмотр:

  • Если текущая версия MySQL используется в существующих проектах, обновление может вызвать некоторые проблемы.

2.Вы можете создавать триггеры для обновления и создания записи, как сказал @Simonare

Преимущества:

  • Реализация управления датами модификации на стороне базы данных

Обратный просмотр:

  • существует много лишних триггеров.Вы создадите два триггера для каждой таблицы.Это означает, что вы создадите N * 2 триггеров для N таблиц.

3.В качестве значения по умолчанию для столбца created можно задать значение 0000-00-00 00:00:00 и для значения по умолчанию для столбца updated значение CURRENT_TIMESTAMP(). .Дата обновления будет сгенерирована автоматически.Также, если вы напишите столбец с null в created, MySQL автоматически сгенерирует текущую дату и установит ее в столбце.Например:

CREATE TABLE example_table (
  created TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  updated_at TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
);

Если вы выполните следующий запрос:

INSERT INTO example_table (created) VALUES (null);

created столбец будет иметь текущее значение даты.MySQL заполнит его автоматически.

Преимущества:

  • нет лишних триггеров

Обратный просмотр:

  • реализация управления датами изменения на стороне базы данных и на стороне клиентского приложения

4.Вы можете использовать автоматическую инициализацию даты в updated столбец и используйте триггер для заполнения created столбец .Например:

CREATE TABLE example_table (
  created TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  updated_at TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
);

DELIMITER //
CREATE TRIGGER example_table_set_created_date
BEFORE INSERT
   ON example_table FOR EACH ROW
BEGIN
   SET NEW.created = CURRENT_TIMESTAMP();
END; //    
DELIMITER;

Преимущества:

  • реализация управления датами изменения на стороне базы данных

Обратный ответ:

  • Есть много лишних триггеров.Вы создадите N триггеров для N таблиц.
0 голосов
/ 24 января 2019

Вы можете создать триггер для этого

DELIMITER //

CREATE TRIGGER user_prefs_before_insert
BEFORE INSERT
   ON user_prefs FOR EACH ROW

BEGIN
   SET NEW.updated = new.created;
END; //

DELIMITER ;

, затем еще один триггер для обновления

DELIMITER //

CREATE TRIGGER user_prefs_before_update
BEFORE UPDATE
   ON user_prefs FOR EACH ROW

BEGIN
   SET NEW.updated = CURRENT_TIMESTAMP();
END; //

DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...