Вопрос по default-value, database, mysql-error-1067, mysql – Временная метка по умолчанию в двух столбцах MySQL ОШИБКА 1067

6

У меня есть таблица, как показано ниже. Чтобы обойти один дефолтсейчас ограничение столбца 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   ответа
7

РэндиКод неисправен. Это победилоне работает, потому что это мутирующий триггер. Вы можете't обновить таблицу, которая инициировала обновление. Например, если вы обновляете таблицу SESSIONS, вы можетеВ этом случае измените таблицу в вашем триггере, используя оператор UPDATE, INSERT или DELETE. Единственный способ изменить таблицу, к которой прикреплен триггер, - это использовать "NEW» или же "OLD» префиксы, как показано ниже. (Конечно, вам разрешено обновлять другие таблицы по желанию.) Вот пример того, как преодолеть проблему, описанную в 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 ;
0

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



После версии MySQL 5.6. + Он допускает два или более столбцов TIMESTAMP в одной таблице.



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

12

один столбец метки времени, по умолчанию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.

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

Это не особенность, это скорее идиотизм. Это'вполне разумно иметь созданный столбец и обновленный столбец, первый из которых по умолчанию устанавливается на дату на вставках, а последний обновляется как на вставке, так и на обновлениях. Khorkrak
Это ограничениебыл отменен с MySQL 5.6.5. Mei
Дискуссия о том, является ли этоошибка» или не остается, поскольку это серьезно раздражает. Почему у меня не может быть двух столбцов с меткой времени по умолчанию now () с автоматическим обновлением второго столбца? Ответ в том, что MySQL этого не делает. Я нена самом деле это называется функцией. randomx
Рэнди, спасибо за твой ответ. Мне известна ссылка, которую вы указали. Я просто ищу обходной путь. Однако, похоже, что все трюки, показанные в Интернете, просто нет работа. Gok Demir
1

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

col1 TIMESTAMP DEFAULT 0,

col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 

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

Похожие вопросы