MySQL Tarih / Saat sütunu için varsayılan değeri nasıl ayarlarsınız?
SQL Server'da öyle getdate()
. MySQL için eşdeğer nedir? Bu bir faktör ise MySQL 5.x kullanıyorum.
MySQL Tarih / Saat sütunu için varsayılan değeri nasıl ayarlarsınız?
SQL Server'da öyle getdate()
. MySQL için eşdeğer nedir? Bu bir faktör ise MySQL 5.x kullanıyorum.
Yanıtlar:
ÖNEMLİ DÜZENLEME: MySQL 5.6.5'ten bu yana DATETIME alanları ile bunu başarmak mümkün , diğer gönderiye bir göz atın aşağıdaki ...
Önceki sürümler DATETIME ile yapamaz ...
Ama bunu TIMESTAMP ile yapabilirsiniz:
mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)
mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str | varchar(32) | YES | | NULL | |
| ts | timestamp | NO | | CURRENT_TIMESTAMP | |
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)
mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+---------------------+
| str | ts |
+------+---------------------+
| demo | 2008-10-03 22:59:52 |
+------+---------------------+
1 row in set (0.00 sec)
mysql>
** CAVEAT: Varsayılan olarak CURRENT_TIMESTAMP ON olan bir sütun tanımlarsanız, DAİMA bu sütun için bir değer belirtmeniz gerekir veya değer güncelleme sırasında kendini otomatik olarak "now ()" olarak sıfırlar. Bu, değerin değişmesini istemiyorsanız, UPDATE ifadenizin "[sütun adınız] = [sütun adınız]" (veya başka bir değer) içermesi gerektiği veya değerin "now ()" olacağı anlamına gelir. Tuhaf, ama gerçek. Umarım bu yardımcı olur. 5.5.56-MariaDB ** kullanıyorum
DATE
sütun için varsayılan bir değere sahip olmak mümkün mü? ( datetime
sütun değil ).
5.6.5 sürümünde, datetime sütununda varsayılan bir değer ayarlamak ve hatta satır güncellendiğinde güncellenecek bir sütun oluşturmak mümkündür. Tür tanımı:
CREATE TABLE foo (
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)
Referans: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL ( sürüm 5.6.5'ten önce ), varsayılan DateTime değerleri için işlevlerin kullanılmasına izin vermez. TIMESTAMP tuhaf davranışı nedeniyle uygun değildir ve giriş verisi olarak kullanılması önerilmez. (Bkz. MySQL Veri Türü Varsayılanları .)
Bununla birlikte, bir Tetikleyici oluşturarak bunu başarabilirsiniz .
DateTime türü bir DateCreated alanı olan bir tablo var. Bu tablo üzerinde "Insert Insert" ve " SET NEW.DateCreated=NOW()
" üzerinde bir tetikleyici oluşturdum ve harika çalışıyor.
Umarım bu birine yardımcı olur.
IF NEW.created_at IS NOT NULL
Benim için tetikleyici yaklaşım en iyi sonucu verdi, ama yaklaşımla ilgili bir engel buldum. Eklemedeki geçerli saate bir tarih alanı ayarlamak için temel tetikleyiciyi düşünün:
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = NOW();
Bu genellikle harika, ancak alanı INSERT ifadesi aracılığıyla manuel olarak ayarlamak istediğinizi varsayalım:
INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');
Olan şey, tetikleyicinin alan için sağladığınız değerin hemen üzerine yazmasıdır ve bu nedenle güncel olmayan bir zamanı ayarlamanın tek yolu bir takip UPDATE ifadesi - yuck! Bir değer sağlandığında bu davranışı geçersiz kılmak için, bu biraz değiştirilmiş tetikleyiciyi IFNULL işleci ile deneyin:
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());
Bu, her iki dünyanın da en iyisini verir: Tarih sütununuz için bir değer sağlayabilirsiniz ve alır ve aksi takdirde varsayılan olarak geçerli saate göre ayarlanır. Hala tablo tanımında VARSAYILAN GETDATE () gibi temiz bir şeye göre getto, ama biz yaklaşıyoruz!
NULL
. Artık uyarı yok.
dateAdded
tüm '0000-00-00 00:00:00' gösterilir. Bunu kullanmak hile yapar: `NEW.date Added = 0 EĞER HER SATIR İÇİN SONRA NEW.date Added = NOW (); END IF; ``
İki datetime alanı olan masamda bu alter deyimini kullanarak bunu çözebildim.
ALTER TABLE `test_table`
CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Bu, now () işlevinin çalışmasını beklediğiniz gibi çalışır. Null değerlerinin eklenmesi veya created_dt ve updated_dt alanlarının yoksayılması, her iki alanda da mükemmel bir zaman damgası değeriyle sonuçlanır. Satırdaki herhangi bir güncelleme updated_dt dosyasını değiştirir. MySQL sorgu tarayıcısı aracılığıyla kayıt eklerseniz, bir adım daha gerekiyordu: trigger_dt dosyasını yeni bir zaman damgasıyla işlemek için bir tetikleyici.
CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
FOR EACH ROW SET NEW.created_dt = NOW();
Tetikleyici istediğiniz gibi olabilir Sadece adlandırma kuralını seviyorum [trig] _ [my_table_name] _ [insert]
Bu tür şeyler yapmak için tetikleyicileri kullanabilirsiniz.
CREATE TABLE `MyTable` (
`MyTable_ID` int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData` varchar(10) NOT NULL ,
`CreationDate` datetime NULL ,
`UpdateDate` datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;
CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
-- Set the creation date
SET new.CreationDate = now();
-- Set the udpate date
Set new.UpdateDate = now();
END;
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END;
Varsayılan bir ayarlamaya çalışırken kalbi kaybeden herkes için DATETIME değeri MySQL sen / keçeyi nasıl hissettiğini, kesinlikle biliyorum. İşte burada:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
Dikkatle gözlemleyin ben tek tırnak / çift tırnak eklememiş etrafında 0
Bunu çözdükten sonra tam anlamıyla zıplıyorum: D
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
Tabloyu daha önce oluşturduysanız,
Varsayılan değeri geçerli tarih saatiyle değiştirmek için
ALTER TABLE <TABLE_NAME>
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
Varsayılan değeri '2015-05-11 13:01:01' olarak değiştirmek için
ALTER TABLE <TABLE_NAME>
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';
bu gerçekten korkunç bir haber. İşte bunun için uzun süredir bekleyen bir hata / özellik isteği . bu tartışma, zaman damgası veri türünün sınırlamalarından da bahseder.
Bu şeyi hayata geçirmeyle ilgili sorunun ne olduğunu gerçekten merak ediyorum.
MySql Server 5.7.11 çalıştırıyorum ve bu cümle:
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
edilir değil çalışma. Ancak aşağıdakiler:
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
sadece çalışır .
Bir sidenote olarak , mysql belgelerinde belirtilmiştir :
DATE türü, tarih bölümü olan ancak saat bölümü olmayan değerler için kullanılır. MySQL, DATE değerlerini 'YYYY-AA-GG' biçiminde alır ve görüntüler. Desteklenen aralık '1000-01-01' ila '9999-12-31'dir.
ayrıca şunu da söyleseler bile:
Geçersiz DATE, DATETIME veya TIMESTAMP değerleri uygun türdeki “sıfır” değerine dönüştürülür ('0000-00-00' veya '0000-00-00 00:00:00').
Tarih (saat) sütununun değerini ayarlamak için now () öğesini kullanabilirsiniz, ancak bunu varsayılan değer olarak kullanamayacağınızı unutmayın.
NOW()
ve daha sonra ekleme için kullanın. 5.6 sürümü NOW()
için varsayılan değer olarak ayarlamanız yeterlidir .
TIMESTAMP sütununu bir çözüm olarak kullanan herkes için, el kitabından aşağıdaki sınırlamayı ikna etmek istiyorum:
http://dev.mysql.com/doc/refman/5.0/en/datetime.html
"TIMESTAMP veri türünün aralığı ' 1970-01-01 00:00:01' UTC'den ' 2038-01-19 03:14:07 . MySQL sürümüne ve SQL'e bağlı olarak değişen özelliklere sahiptir. sunucunun çalıştığı modda. Bu özellikler bu bölümün ilerleyen kısımlarında açıklanmaktadır. "
Yani bu yazılımınızı yaklaşık 28 yıl içinde bozacaktır.
Veritabanı tarafında tek çözüm diğer cevaplarda belirtildiği gibi tetikleyicileri kullanmak olduğuna inanıyorum.
Çok satırlı tetikleyicileri tanımlarken, noktalı virgülün değiştirilmesi gerekir, çünkü noktalı virgül MySQL derleyicisi tarafından tetiklemenin sonu olarak alınır ve hata üretir. Örneğin
DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END//
DELIMITER ;
MySQL 5.1'de nasıl yapılacağı aşağıda açıklanmıştır:
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
Neden sütun adını iki kez girmeniz gerektiğine dair hiçbir fikrim yok.
Varsayılan değeri NOW () olarak ayarlamaya çalışıyorsanız, MySQL'in bunu desteklediğini sanmıyorum. MySQL'de, CURRENT_TIMESTAMP değerini varsayılan olarak belirtebileceğiniz TIMESTAMP veri türü sütunu dışında herhangi bir sütun türü için varsayılan değer olarak bir işlev veya ifade kullanamazsınız.
Ben mysql beri mysql şimdiki zaman (o insert zaman) veren now () denilen dahili işlevi basit olduğunu düşünüyorum.
Bu yüzden sorgunuz benzer şekilde görünmelidir
CREATE TABLE defaultforTime(
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME default now()
);
Teşekkür ederim.
CREATE TABLE `testtable` (
`id` INT(10) NULL DEFAULT NULL,
`colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)
Yukarıdaki sorguda 'testtable' oluşturmak için, '1999-12-12 12:12:12' değerini DATETIME sütunu için varsayılan değer olarak kullandım colname
Aşağıdaki kodu kullanın
DELIMITER $$
CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
BEGIN
SET new.datefield = NOW();
END $$
DELIMITER ;
Varsayılan değeri NOW () olarak ayarlamaya çalışıyorsanız, MySQL, DATETIME yerine TIMESTAMP sütununun türünü değiştirmeniz gerektiğini destekler. TIMESTAMP varsayılan olarak geçerli tarih ve saate sahiptir .. bence sorununuzu çözecektir ..
Örneğin, DATETIME olan ve şu an için varsayılan değere ihtiyaç duyulan bir create_at ve update_at sütununa sahip 'site' adlı bir tablom olsaydı, bunu başarmak için aşağıdaki sql'i yürütebilirim.
ALTER TABLE `site` CHANGE` created_at`` created_at` TIMESTAMP BOŞ DEĞİL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE `site` CHANGE` yaratılmış_at`` oluşturulur_at` DATETIME NULL VARSAYILAN NULL; ALTER TABLE `site` CHANGE` updated_at`` updated_at` TIMESTAMP BOŞ DEĞİL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE `site` CHANGE` updated_at`` updated_at` DATETIME NULL DEFAULT NULL;
Bir tablonun varsayılan değerleri CUREENT TIMESTAMP olan TIMESTAMP türünde iki sütun bulunamadığından, ifade sırası önemlidir
Bu benim tetik örneğim:
/************ ROLE ************/
drop table if exists `role`;
create table `role` (
`id_role` bigint(20) unsigned not null auto_increment,
`date_created` datetime,
`date_deleted` datetime,
`name` varchar(35) not null,
`description` text,
primary key (`id_role`)
) comment='';
drop trigger if exists `role_date_created`;
create trigger `role_date_created` before insert
on `role`
for each row
set new.`date_created` = now();
MySQL 8.x ile iyi çalışıyor
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
`dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Varsayılan zaman damgasını çözebilirsiniz. Öncelikle hangi karakter setini kullandığınızı düşünün; örneğin, utf8'i aldıysanız bu karakter seti tüm dilleri destekliyorsa ve u laten1 aldıysanız, bu karakter seti sadece İngilizce'yi desteklemektedir. Sonraki setp herhangi bir proje altında çalışıyorsanız, istemci saat dilimini bilmeli ve istemci bölge olduğunuzu seçmelisiniz. Bu adım zorunludur.