2011-07-05 21 views
9

Hem "oluşturulan" hem de "güncelleştirilmiş" için başka bir sütuna sahip bir tablo oluşturmak istiyorum. Oluşturulan sütun "insert" olarak ayarlanacak ve asla değişmeyecek. Bir satır güncellendiğinde "güncellenmiş" sütunu değişecektir. Sonraki sütunlardan INSERT veya UPDATE ifadelerinde karışıklık yapmak istemiyorum. Öyleyse CREATE TABLE ifadem böyle bir şeyle başlayacak olsam nasıl görünmeli?Bir tabloda iki MySQL zaman damgası sütunları

CREATE TABLE IF NOT EXISTS `mydb`.`mytable` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `updated` TIMESTAMP, 
    `created` TIMESTAMP, 
    `deleted` TINYINT DEFAULT 0, 
    `notes` TEXT DEFAULT '', 
    `description` VARCHAR(100) 
) TYPE=innodb; 

İki TIMESTAMP sütunuyla bir tablo oluşturma konusunda sorun yaşıyorum. Sütunların TIMESTAMP veya DATETIME olup olmadığına ya da herhangi bir şeye benzememesi umurumda değil, sadece eklentilerden veya güncelleme ifadelerinden açık talimatlar olmadan MySQL tarafından doldurulmasını istiyorum. Böyle

INSERT INTO `mydb`.`mytable` (notes,description) VALUES ('some note','some description'); 

ve güncellemeleri:

böyle ekler yapabilmek istiyorum açıkça "oluşturulmuş" sütunu ayarlamak veya ayarlamak zorunda kalmadan

UPDATE `mydb`.`mytable` SET notes=CONCAT(notes,'some more notes') WHERE id=1; 

her ikisi (veya ekleme veya güncelleme deyimindeki "güncelleştirilmiş" sütunu sıfırlayın.

+0

gibi zaman damgası sütun sırasını değiştirmek için Güncelleme gerçekleştiğinde her "sütun güncellendi". Tam bir örnekle cevap verdim, ama bu günlerde sadece PostgreSQL'i kullandığımdan, MySQL'de bunun nasıl yapıldığını bilmiyorum. Ama eminim ki MySQL kılavuzu size tam sözdizimini sağlayacaktır. [Birden TIMESTAMP Sütunlar Tek MySQL Tablo] arasında – Flimzy

+1

olası yinelenen (http://stackoverflow.com/questions/4851672/one-mysql-table-with-multiple-timestamp-columns) –

cevap

7

sizin tablo oluşturmak için bu bir deneyin:

CREATE TABLE IF NOT EXISTS db.test_table 
(
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
created DATETIME DEFAULT NULL, 
updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
deleted TINYINT DEFAULT 0, 
notes TEXT DEFAULT NULL, 
description VARCHAR(100) 
) 

Not o

updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

bu alanın otomatik güncelleştirmesine izin verecektir çalışma kolu.

Ve takmadan kayıtların önce tetikleyici için bu bir set:

DELIMITER $$ 

CREATE 
    /*[DEFINER = { user | CURRENT_USER }]*/ 
    TRIGGER `db`.`on_before_insert` BEFORE INSERT 
    ON `db`.`test_table` 
    FOR EACH ROW BEGIN 
    SET new.created = NOW();  
    END$$ 

DELIMITER ; 

Sonra eklemek için kullanabilir:

INSERT INTO db.test_table(description) VALUES ("Description") 

ve kayıt güncellemek için

UPDATE db.test_table SET description = "Description 2" where Id=1 

Ve oluşturulan ve güncellenen alanlarınız uygun şekilde ayarlanacaktır.

+0

sorulan soruya en açık cevap için kazanırsınız. @Dark Slipstream'in cevabının çok şey sunabileceği çok şey var. –

+0

Zaman damgasının hem oluşturulmuş hem de güncellenmiş olması gerektiğini düşünüyorum. Mysql sürüm 5.5 ile oluşturulan zaman damgasını current_timestamp değerine varsayılan olarak ayarlayabilir ve güncellemeleri otomatik güncellemeye güncellenmiş zaman damgasını ayarlayabilir ve varsayılan mevcut zaman damgasını varsayılan olarak ayarlayabilirsiniz. Ve tetikleyici gerekli değildir. –

0

Maalesef MySQL bir tabloda iki TIMESTAMP sütununa sahip olmanıza izin vermiyor. Güncel sütun için ON UPDATE CURRENT_TIMESTAMP öğesini ve NOW() işlevini kullanarak manuel olarak oluşturulmuş kümeyi kullanırdım.

+0

"oluşturdu ayarı, soruma belirtildiği gibi "el ile açıkça kaçınmak istediğim şeydir. –

+0

Umarım yanlış olduğumu umarım ve bunu yapmanın daha iyi bir yolu vardır! :) –

+0

Andreas Jansson, tek başına tablo tanımları ile desteklenmese de, bunun başarılması hala çok kolay. James_bond'un cevabını görün. –

2

bu deneyin:

CREATE TABLE IF NOT EXISTS mydb.mytable 
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    updated DATETIME, 
    created TIMESTAMP, 
    deleted TINYINT DEFAULT 0, 
    notes TEXT DEFAULT '', 
    description VARCHAR(100) 
) TYPE=innodb; 

Düzenleme: bir tetikleyici kullanın.

CREATE TRIGGER mytable_update 
BEFORE UPDATE ON mydb.mytable 
    FOR EACH ROW SET NEW.updated = NOW(); 
+0

Birazdan() –

+0

You DATETIME YAPIN DEFAULT olabilir sanmıyorum .. Başka bir çözüm arıyor ... –

+0

Yukarıdaki kodla aşağıdaki hatayı alıyorum: –

1

haberi: mysql olarak TIMESTAMP kolonlar hep now() ile üst üste başka sütun her güncellendiğinde güncellenir - bu veri türü kasıtlı bir özelliğidir. Diğer yandan, bu garip davranışa sahip olmayan, tamamen normal olan

cevap: createdDATETIME olmalıdır, ancak this bug nedeniyle, ayrıca bu gibi bir tetikleyici gerekir:

CREATE TABLE IF NOT EXISTS mytable (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `updated` TIMESTAMP, -- This will be updated to now(), if you don't set it or set it to null 
    `created` DATETIME NOT NULL, -- This will never be magically updated once written 
    `deleted` TINYINT DEFAULT 0, 
    `notes` TEXT DEFAULT '', 
    `description` VARCHAR(100) 
) TYPE=innodb; 

DELIMITER ~ 
CREATE TRIGGER mytable_insert_trigger 
BEFORE INSERT ON mytable 
FOR EACH ROW BEGIN 
    SET NEW.created = CURRENT_TIMESTAMP; 
END;~ 
DELIMITER ; 

insert into mytable (notes) values ('test'); 
select * from mytable; 
+----+---------------------+---------------------+---------+-------+-------------+ 
| id | updated    | created    | deleted | notes | description | 
+----+---------------------+---------------------+---------+-------+-------------+ 
| 1 | 2011-07-05 11:48:02 | 2011-07-05 11:48:02 |  0 | test | NULL  | 
+----+---------------------+---------------------+---------+-------+-------------+ 
+0

, her güncellemede "update" öğesinin otomatik olarak sıfırlanmasının şık bir yolu olduğu gibi, her insert ifadesine açıkça eklemeden ekleme işleminde 'create' ayarlanmasını sağlamaktır. –

+0

Tamam ince - düzeltmek için düzenlenmiş – Bohemian

+0

@Dark Slipstream'ın yukarıdaki yanıtında belirtildiği gibi, NOW() DATETIME ile çalışmaz. –

1

alternatif

VEYA

set İlk sütun DEFAULT değeri Sen "güncellemek için bir ON UPDATE tetikleyicisi ihtiyaç bu

ALTER TABLE `tblname` CHANGE `first_timestamp_column` 
    `first_timestamp_column` TIMESTAMP NOT NULL DEFAULT 0; 

Reference

İlgili konular