Tetapkan SEKARANG () sebagai Nilai Default untuk tipe data datetime?

197

Saya memiliki dua kolom di tabel pengguna yaitu registerDate and lastVisitDateyang terdiri dari tipe data datetime. Saya ingin melakukan hal berikut.

  1. Setel nilai default registerDate ke MySQL NOW ()
  2. Tetapkan nilai default lastVisitDate menjadi 0000-00-00 00:00:00Alih-alih nol yang digunakan secara default.

Karena tabel sudah ada dan memiliki catatan, saya ingin menggunakan tabel Ubah. Saya sudah mencoba menggunakan dua bagian kode di bawah ini, tetapi tidak berhasil.

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

Itu memberi saya Kesalahan: ERROR 1067 (42000): Invalid default value for 'registerDate'

Apakah mungkin bagi saya untuk menetapkan nilai datetime default ke SEKARANG () di MySQL?

Ibrahim Azhar Armar
sumber
4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP. Anda tidak mendefinisikan data typebidang dalam kedua upaya Anda
Shakti Singh
3
Sejak MySQL 5.6 DATEharus bekerja dengan nilai defaultNOW()
AbcAeffchen
Menurut dokumentasi mysql 5.6 ini: dev.mysql.com/doc/refman/5.6/id/data-type-defaults.html , Anda dapat menggunakan CURRENT_TIMESTAMP () sebagai default.
blacktie24
bagaimana saya menerapkan CURRENT_TIMESTAMP + 1 HARI
Ilker Baltaci

Jawaban:

241

Pada MySQL 5.6.5, Anda dapat menggunakan DATETIMEtipe dengan nilai default dinamis:

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

Atau bahkan menggabungkan kedua aturan:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Referensi:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available .html

Sebelum 5.6.5, Anda perlu menggunakan TIMESTAMPtipe data, yang secara otomatis memperbarui setiap kali catatan diubah. Sayangnya, bagaimanapun, hanya satu TIMESTAMPbidang yang diperbarui secara otomatis dapat ada per tabel.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

Lihat: http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Jika Anda ingin mencegah MySQL memperbarui nilai cap waktu pada UPDATE(sehingga hanya memicu INSERT) Anda dapat mengubah definisi menjadi:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
Johan
sumber
80
saya benar-benar tidak ingin menggunakan cap waktu.
Ibrahim Azhar Armar
2
@Ibrahim: cap waktu adalah satu-satunya kesempatan Anda. Jika Anda menggunakan bidang datetime, Anda harus memasukkan catatan menggunakan now () setiap kali.
Nicola Cossu
9
Manual berbicara dengan jelas: "Ini berarti, misalnya, bahwa Anda tidak dapat menetapkan default untuk kolom tanggal menjadi nilai fungsi seperti SEKARANG () atau CURRENT_DATE".
Nicola Cossu
19
@Johan DATETIMEsering lebih disukai untuk melakukan rentang yang dapat ditampungnya: '1000-01-01 00:00:00' hingga '9999-12-31 23:59:59' dibandingkan dengan TIMESTAMPS's' 1970-01-01 00: 00:01 'UTC hingga' 2038-01-19 03:14:07 'UTC. Untuk keperluan menyimpan tanggal lahir, atau sesuatu yang lebih dari 30 tahun di masa depan misalnya.
user17753
5
@nickrulez Anda tidak lagi dibatasi timestampuntuk perilaku ini pada MySQL 5.6
Dan Esparza
70

Saya menggunakan pemicu sebagai solusi untuk menetapkan bidang datetime ke SEKARANG () untuk sisipan baru:

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

itu harus bekerja untuk pembaruan juga

Jawaban oleh Johan & Leonardo melibatkan pengubahan ke bidang stempel waktu. Meskipun ini mungkin ok untuk use case yang disajikan dalam pertanyaan (menyimpan RegisterDate dan LastVisitDate), ini bukan solusi universal. Lihat pertanyaan datetime vs timestamp .

bangsal
sumber
4
Ini harus menjadi jawaban yang diterima, tetapi secara khusus Anda harus mengeditnya untuk membuatnya jelas itu untuk bidang datetime. Poster asli ingin tahu bagaimana menyelesaikannya untuk bidang waktu, dan use a timestampmerupakan solusi bodoh jika Anda benar-benar mempelajari perbedaan antara kedua tipe data ini.
phpguru
45

Solusi saya

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
Leonardo
sumber
Def ini berfungsi, saya sarankan semua orang untuk menggunakan SQLYog atau alat seperti itu, itu memungkinkan Anda melakukan hal-hal ini pada antarmuka yang mudah.
Bata Abadi
27
Ini masih solusi untuk TIMESTAMPkolom. Tidak ada yang meminta TIMESTAMP...
Petr Peller
2
Ya, ini bukan jawaban untuk pertanyaan itu. TIMESTAMP adalah jenis bidang yang berbeda dengan DATETIME.
John Hunt
@Leonardo bagaimana saya hanya menampilkan tanggal
151291
13

EUREKA !!!


Untuk semua yang kehilangan hati mencoba untuk menetapkan nilai DATETIME default di MySQL , saya tahu persis bagaimana perasaan Anda / rasakan. Jadi begini:

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

Hati-hati mengamati bahwa saya belum menambahkan tanda kutip tunggal / tanda kutip ganda sekitar 0 .


Pembaruan penting :

Jawaban ini telah diposting sejak lama. Saat itu, itu berhasil pada instalasi MySQL saya (mungkin terbaru) dan saya merasa ingin membagikannya. Silakan baca komentar di bawah sebelum Anda memutuskan untuk menggunakan solusi ini sekarang.

Augiwan
sumber
16
Tergantung pada harapan ... - Solusi ini memungkinkan Anda memiliki bidang BUKAN NULL, karena default disediakan. - Solusi ini tidak akan mengatur bidang ke SEKARANG ().
CodeReaper
10
Ini tidak menjawab pertanyaan awal; jawabannya harus menyatakan itu dengan jelas.
Matt Browne
2
Ketahuilah bahwa mode SQL TRADITIONAL menyertakan NO_ZERO_DATE, jadi hal di atas tidak akan berfungsi jika demikian.
Móż
Berdasarkan jawaban yang diberikan, sepertinya jika Anda tidak akan mengorbankan DATETIME menjadi TIMESTAMP, maka Anda harus menggunakan pemicu.
Chris
1
Solusi ini akan membuat beberapa orang gila dengan "OMG, ini adalah NOL tanggal! Betapa HERESY! Kami tidak dapat mengonversi 'ini' ke java.lang.Date/System.DateTime! OMG! -Crash-".
Felype
4

Pada versi mysql 5.6.5 dan yang lebih baru, Anda dapat menggunakan datetimes yang tepat dan menetapkan nilai default juga. Ada sedikit yang halus, yaitu untuk memberikan nilai presisi untuk kedua fungsi waktu dan panggilan SEKARANG ().

Contoh Ini Berhasil:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

Contoh Ini Tidak Berfungsi:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();
Matteius
sumber
1
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

Dapat digunakan untuk memperbarui timestamp saat pembaruan.

veelen
sumber
1

Cara terbaik menggunakan "DEFAULT 0". Cara lain:

    /************ 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();
Lucas Moyano Angelini
sumber
0

Ini bekerja untuk saya, menggunakan MySQL:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
rosshump
sumber
0
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Akhirnya, ini berhasil bagi saya!

Mata Elang
sumber
0
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;
Gvs Akhil
sumber
-1

Tidak yakin apakah ini masih aktif tetapi ini dia.

Mengenai pengaturan default ke Sekarang (), saya tidak melihat itu mungkin untuk tipe data DATETIME. Jika Anda ingin menggunakan tipe data itu, atur tanggal ketika Anda melakukan insert seperti ini:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

Versi mySQL saya adalah 5.5

George
sumber
7
Dapat disederhanakan sebagai:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753
-1

Ini bekerja untuk saya - baru saja mengubah INSERT menjadi UPDATE untuk tabel saya.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Generasi yang berbeda
sumber