2009-09-22 2 views
6

У меня есть таблица, как показано ниже. Для того, чтобы обойти один по умолчанию теперь ограничение столбца MySQL я использовал наконечник, как показано hereMySQL двухстоечная метка времени по умолчанию Значение NOW ERROR 1067

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 как указано here мой вывод:

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

Как это исправить? Благодарю.

ответ

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. 

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

+0

Это не ошибка, это особенность: «Для одного столбца TIMESTAMP в таблице, вы можете присвоить текущую метку время в качестве значения по умолчанию и значения автоматического обновления . Возможно, текущая временная метка является значением по умолчанию для инициализации столбца, для значения автоматического обновления или для обоих. Невозможно, чтобы текущая временная метка была значением по умолчанию для одного столбца и значением автоматического обновления для другого столбца. » –

+0

Дебаты о том, является ли это« ошибкой »или нет, поскольку это серьезно раздражает. Почему у меня нет двух столбцов временной отметки со значением по умолчанию now() со вторым обновлением столбца? Ответ заключается в том, что MySQL этого не делает. Я действительно не называю эту функцию. –

+0

Рэнди благодарит за ответ. Я знаю ссылку, которую вы предоставили. Я просто ищу обходной путь. Однако кажется, что все трюки, показанные в Интернете, просто не работают. –

7

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

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 ; 
1

Для этого и он работает:

col1 TIMESTAMP DEFAULT 0, 

col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 

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

0

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

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

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

Смежные вопросы