Pertanyaan Bagaimana Anda menetapkan nilai default untuk kolom Datetime MySQL?


Bagaimana Anda menetapkan nilai default untuk kolom Datetime MySQL?

Di SQL Server itu getdate(). Apa persamaan untuk MySQL? Saya menggunakan MySQL 5.x jika itu adalah faktor.


761
2017-10-03 20:24


asal


Jawaban:


EDIT PENTING: Sekarang mungkin untuk mencapai ini dengan bidang DATETIME sejak MySQL 5.6.5, lihatlah pos lainnya di bawah...

Versi sebelumnya tidak dapat melakukannya dengan DATETIME ...

Tetapi Anda dapat melakukannya dengan TIMESTAMP:

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: JIKA Anda menetapkan kolom dengan CURRENT_TIMESTAMP ON sebagai default, Anda harus SELALU menentukan nilai untuk kolom ini atau nilai akan secara otomatis mengatur ulang dirinya ke "now ()" pada pembaruan. Ini berarti bahwa jika Anda tidak ingin nilai berubah, pernyataan UPDATE Anda harus berisi "[nama kolom Anda] = [nama kolom Anda]" (atau beberapa nilai lainnya) atau nilainya akan menjadi "sekarang ()". Aneh, tapi benar. Saya harap ini membantu. Saya menggunakan 5.5.56-MariaDB **


750
2017-10-03 20:48



Di versi 5.6.5, dimungkinkan untuk menetapkan nilai default pada kolom datetime, dan bahkan membuat kolom yang akan diperbarui ketika baris diperbarui. Definisi jenis:

CREATE TABLE foo (
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)

Referensi: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html


492
2018-05-15 14:44



MySQL (sebelum versi 5.6.5) tidak mengizinkan fungsi yang akan digunakan untuk nilai DateTime default. TIMESTAMP tidak cocok karena perilaku anehnya dan tidak disarankan untuk digunakan sebagai data masukan. (Lihat Default Tipe Data MySQL.)

Bisa dikatakan, Anda bisa mencapai ini dengan membuat Trigger.

Saya memiliki tabel dengan bidang DateCreated tipe DateTime. Saya membuat pemicu di meja itu "Sebelum Sisipkan" dan "SET NEW.DateCreated=NOW()"Dan itu berfungsi dengan baik.

Saya harap ini membantu seseorang.


135
2017-09-27 17:04



Bagi saya pendekatan pemicu telah bekerja dengan baik, tetapi saya menemukan halangan dengan pendekatan tersebut. Pertimbangkan pemicu dasar untuk menetapkan bidang tanggal ke waktu saat ini di sisipkan:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

Ini biasanya bagus, tetapi katakan Anda ingin mengatur bidang secara manual melalui pernyataan INSERT, seperti:

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

Apa yang terjadi adalah bahwa pemicu segera menimpa nilai yang Anda berikan untuk bidang, dan jadi satu-satunya cara untuk menetapkan waktu tidak aktif adalah tindak lanjut pernyataan UPDATE - yuck! Untuk mengganti perilaku ini saat nilai diberikan, coba pemicu yang sedikit dimodifikasi ini dengan operator IFNULL:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

Ini memberikan yang terbaik dari kedua dunia: Anda dapat memberikan nilai untuk kolom tanggal Anda dan itu akan mengambil, dan jika tidak, itu akan default ke waktu saat ini. Ini masih ghetto relatif terhadap sesuatu yang bersih seperti DEFAULT GETDATE () dalam definisi tabel, tetapi kita semakin dekat!


127
2018-04-20 14:12



Saya bisa memecahkan ini menggunakan pernyataan perubahan ini di meja saya yang memiliki dua bidang datetime.

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;

Ini berfungsi seperti yang Anda harapkan sekarang () berfungsi untuk bekerja. Memasukkan null atau mengabaikan bidang created_dt dan updated_dt menghasilkan nilai timestamp yang sempurna di kedua bidang. Setiap pembaruan ke baris mengubah updated_dt. Jika Anda memasukkan catatan melalui peramban kueri MySQL, Anda perlu satu langkah lagi, pemicu untuk menangani created_dt dengan stempel waktu baru.

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
    FOR EACH ROW SET NEW.created_dt = NOW();

Pemicu dapat berupa apa pun yang Anda inginkan, saya seperti konvensi penamaan [trig] _ [my_table_name] _ [insert]


22
2018-02-12 17:44



Anda dapat menggunakan pemicu untuk melakukan hal semacam ini.

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;

22
2018-06-22 17:32



Untuk semua orang yang kehilangan semangat mencoba mengatur default TANGGAL WAKTU nilai dalam MySQLSaya tahu persis bagaimana perasaan / perasaan Anda. Jadi ini dia:

ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

Hati-hati amati itu Saya belum menambahkan tanda kutip tunggal / tanda kutip ganda sekitar 0

Saya benar-benar melompat setelah menyelesaikan yang satu ini: D


13
2018-03-10 18:38



ini memang berita buruk.di sini ada permintaan bug / fitur yang tertunda untuk ini. diskusi itu juga berbicara tentang batasan tipe data timestamp.

Saya benar-benar bertanya-tanya apa masalahnya dengan menerapkan hal ini.


12
2018-02-21 21:28



MySQL 5.6 telah memperbaiki masalah ini.

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'

12
2017-08-06 10:13



Untuk semua yang menggunakan kolom TIMESTAMP sebagai solusi, saya ingin menambah batasan berikut dari manual:

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

"Jenis data TIMESTAMP memiliki rentang '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC. Ini memiliki sifat yang bervariasi, tergantung pada versi MySQL dan mode SQL server berjalan masuk. Properti ini dijelaskan nanti di bagian ini. "

Jadi ini jelas akan merusak perangkat lunak Anda dalam waktu sekitar 28 tahun.

Saya percaya satu-satunya solusi di sisi basis data adalah menggunakan pemicu seperti yang disebutkan dalam jawaban lain.


7
2017-12-07 14:31