2009-09-22 36 views
6

Aşağıda gösterildiği gibi bir tablom var. HalaMySQL iki sütun zaman damgası varsayılan NOW değeri HATA 1067

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

veriyor: here benim çıkışını belirttiği gibi Benim sql_mode NO_ZERO_DATE içermez

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; 
here gösterildiği gibi artık bir varsayılan MySQL kolon kısıtlamasını geçici çözüm için ben ucu kullanılır aşağıdaki gibi hata:

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

MySQL 5.1.37'yi kullanıyorum Ubuntu

Nasıl düzeltebilirim? Teşekkürler.

cevap

12

Yalnızca bir zaman damgası sütun sahip olabileceği CURRENT_TIMESTAMP veya tablo başına NOW() varsayılan. Bu MySQL'de iyi bilinen bir hatadır.

Bunu üstesinden gelmek için, oluşturulan sütunun geçerli bir zaman damgası değeri için varsayılanınızı yapın, ardından CRUD uygulama kodunuzdaki zaman damgasını ekleyin. Güncel sütun varsayılanınız için NOW() veya CURRENT_TIMESTAMP kullanın.

Referans malzemesi: http://dev.mysql.com/doc/refman/5.1/en/timestamp.html

ayrıca bu alandaki MySQL'ın eksiklikler göstermek için, aşağıdaki kodu göz önünde bulundurun:

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

bu irade ekranından çıkışı:

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. 

budur Bu örnekte bir tetikleyici kullanmak iyi bir iş olurdu çünkü bir bummer.

+0

mysql sürümünü güncelleyerek deneyebilirsiniz Geçerli zaman damgasının, sütunu, otomatik güncelleme değerini veya her ikisini birden başlatmak için varsayılan değeri olması mümkündür. Geçerli zaman damgasının bir sütun ve otomatik güncelleme değeri için varsayılan değer olması mümkün değildir. Başka bir sütun için. " –

+0

Bunun bir" hata "olup olmadığı konusundaki tartışmalar bu kadar ciddiye alınmaya devam ediyor. İkinci sütunu otomatik güncellemeyle birlikte varsayılan() varsayılan iki zaman damgası sütununa neden sahip olmayabilirim? Cevap, MySQL'in bunu yapmadığıdır. Buna gerçekten bir özellik demiyorum. –

+0

Randy Cevabınız için teşekkür ederiz. Sağladığınız bağlantının farkındayım. Sadece bir çözüm bulmaya çalışıyorum. Ancak, internette gösterilen tüm numaralar işe yaramıyor gibi görünüyor. –

7

Aslında, Randy'nin kodu bozuldu. Çalışmıyor, çünkü bu mutasyona neden oluyor. Güncellemeyi başlatan tabloyu güncelleyemezsiniz. Örneğin, SESSIONS tablosunu güncelliyorsanız, bir UPDATE, INSERT veya DELETE ifadesi kullanarak tetikleyicinizdeki tabloyu değiştiremezsiniz. Tetikleyicinin eklendiği tabloyu değiştirmenize izin vermenin tek yolu, aşağıda gösterildiği gibi "YENİ" veya "OLD" öneklerini kullanmaktır. (Tabii ki, diğer tabloları istediğiniz zaman güncellemenize izin verilir.) Burada, op tarafından açıklanan sorunun üstesinden nasıl gelineceğine dair bir örnek verilmiştir.

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

Bunu yapmak ve o iş sağlamak için:

col1 TIMESTAMP DEFAULT 0, 

col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 

Sadece değer Sorgunuzda BOŞ olmasını sağlamak, col1 için bir tetikleyici gerekmez. Cevap, sertifika kılavuzundadır.

0

Varsayılan TIMESTAMP, aynı tabloda 5.6.1 sürümlerinden önce MySQL'de desteklenmemektedir.

MySQL 5.6 sürümünden sonra + aynı tablodaki iki veya daha fazla TIMESTAMP sütununa izin verir. "Bir tablodaki bir TIMESTAMP sütun için, varsayılan değeri ve otomatik güncelleme değeri olarak geçerli zaman damgası atayabilirsiniz:

Bu, bir özellik bir hata olduğunu değil

İlgili konular