MySQL два столбца timestamp по умолчанию теперь ошибка значения 1067

у меня есть таблица, как показано ниже. Чтобы обойти одно значение по умолчанию теперь ограничение столбца MySQL я использовал подсказку, как показано здесь

CREATE  TABLE IF NOT EXISTS mytable (
  id INT NOT NULL AUTO_INCREMENT ,
  create_date TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00' ,
  update_date TIMESTAMP NULL DEFAULT NOW() ON UPDATE NOW() ,
  PRIMARY KEY (`parti_id`) )
ENGINE = InnoDB;

мой sql_mode не включает в себя NO_ZERO_DATE как указал здесь мой вывод :

mysql> SELECT @@sql_mode;
+------------+
| @@sql_mode |
+------------+
|            | 
+------------+
1 row in set (0.00 sec)

Он по-прежнему дает ошибку, как показано ниже:

ERROR 1067 (42000) at line xx in file: '/myschema.sql': Invalid default value for 'create_date'

Я использую MySQL 5.1.37 на Ubuntu

как я могу это исправить? Спасибо.

4 ответов


может быть только один столбец timestamp, который по умолчанию CURRENT_TIMESTAMP или NOW() в таблице. Это хорошо известная ошибка в MySQL.

чтобы преодолеть это, сделайте значение по умолчанию для созданного столбца допустимым значением метки времени, а затем вставьте метку времени в код приложения CRUD. Использовать NOW() или CURRENT_TIMESTAMP для обновленного столбца по умолчанию.

справочный материал: http://dev.mysql.com/doc/refman/5.1/en/timestamp.html

в далее проиллюстрируем недостаток MySQL в этой области, рассмотрим следующий код:

CREATE TABLE testing_timestamps (
  id INT NOT NULL AUTO_INCREMENT,
  pk_id INT NOT NULL,
  col1 TIMESTAMP DEFAULT 0,
  col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY(id)
);

delimiter $$
CREATE TRIGGER testing_timestamps_trigger
  AFTER INSERT ON testing_timestamps
  FOR EACH ROW 
  BEGIN
    UPDATE testing_timestamps SET col1 = NOW() WHERE id = MAX(id);
  END;
$$
delimiter ;

INSERT INTO testing_timestamps (id) VALUES (0);

вывод из этого будет отображаться:

mysql> INSERT INTO testing_timestamps (id) VALUES (0);
ERROR 1442 (HY000): Can't update table 'testing_timestamps' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

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


на самом деле, код Рэнди разбивается. Это не сработает, потому что это мутирующий триггер. Вы не можете обновить таблицу, которая инициировала обновление. Например, при обновлении сеансов таблицы нельзя изменить таблицу в триггере с помощью инструкции UPDATE, INSERT или DELETE. Единственный способ изменить таблицу, к которой подключен триггер, - использовать префиксы" новый "или" старый", как показано ниже. (Конечно, вы можете обновлять другие таблицы в будет.) Вот пример того, как преодолеть проблему, описанную op.

create table sessions (
    id integer not null,
    created timestamp not null default 0,
    updated timestamp not null default 0
);

delimiter //
create trigger bifer_sessions_ts before insert on sessions for each row
begin
    set new.created = now();
    set new.updated = now();
end;
//
create trigger bufer_sessions_ts before update on sessions for each row
begin
    set new.updated = now();
end;
//
delimiter ;

чтобы сделать это и заставить его работать:

col1 TIMESTAMP DEFAULT 0,

col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 

вам не нужен триггер для col1, просто убедитесь, что значение равно NULL в вашем запросе. Ответ содержится в руководстве по сертификации.


метка времени по умолчанию не поддерживается в MySQL до версий 5.6.1 в той же таблице.

после версии MySQL 5.6.+ это позволяет два или более столбцов TIMESTAMP в одной таблице.

вы можете попробовать обновить версию MySQL