Tidak dapat menetapkan tanggal default ke CURRENT_TIMESTAMP di MySQL 5.5

18

Saya tidak dapat menetapkan Current_timestampsebagai nilai default. MysqlVersi saya adalah 5.5.47.

Permintaan adalah

ALTER TABLE `downloads` ADD `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;

masukkan deskripsi gambar di sini

Sementara itu berfungsi dengan baik pada DB lokal saya dengan mysql V5.6.56.

urfusion
sumber
Masalahnya adalah karena mikrodetik ditambahkan dalam nilai default di versi baru mysql. Lihat tekina.info/… untuk solusinya.
Aniket Singh

Jawaban:

25

Dari manual MySQL 5.5 :

Anda tidak dapat menetapkan default untuk kolom tanggal menjadi nilai fungsi seperti SEKARANG () atau CURRENT_DATE. Pengecualiannya adalah Anda dapat menentukan CURRENT_TIMESTAMP sebagai default untuk kolom TIMESTAMP.

Oleh karena itu, apa yang ingin Anda capai akan berfungsi di MySQL 5.5 jika Anda menambahkan TIMESTAMPkolom, bukan DATEkolom.

Perubahan pada 5.6.x yang memungkinkan fungsi didokumentasikan di sini , dan saya akan mengutip ringkasan yang relevan untuk kelengkapan:

Pada MySQL 5.6.5, kolom TIMESTAMP dan DATETIME dapat secara otomatis diinisialisasi dan diperbarui ke tanggal dan waktu saat ini (yaitu, cap waktu saat ini). Sebelum 5.6.5, ini hanya berlaku untuk TIMESTAMP, dan paling banyak satu kolom TIMESTAMP per tabel.

Philᵀᴹ
sumber
8

Periksa jawaban ini .

Pilihan Anda adalah:

  • Tingkatkan ke MySQL 5.6.5
  • Ubah jenis kolom menjadi TIMESTAMP, seperti pada:

    ALTER TABLE `downloads` ADD `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
  • Buat TRIGGER YANG memperbarui kolom secara otomatis:

    ALTER TABLE `downloads` ADD `date` DATETIME NULL; -- date must allow
                                                      -- NULLs or default
                                                      -- to a special value
    DROP TRIGGER IF EXISTS downloads_BI;
    DELIMITER //
    CREATE TRIGGER downloads_BI
    BEFORE INSERT ON downloads FOR EACH ROW
    BEGIN
        IF (NEW.date IS NULL) THEN -- change the isnull check for the default used
            SET NEW.date = now();
        END IF;
    END//
    DELIMITER ;
    

    Anda mungkin ingin membuat nilai pembaruan juga, jika harus diperbarui secara otomatis saat pembaruan atau ingin mencegah nilai nol.

    mysql> INSERT INTO downloads (i) VALUES (1); -- I do not set date
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT * FROM downloads;
    +------+---------------------+
    | i    | date                |
    +------+---------------------+
    |    1 | 2016-03-22 09:27:52 |
    +------+---------------------+
    1 row in set (0.00 sec)
    
jynus
sumber