Saya memiliki skema tabel berikut;
CREATE TABLE `db1`.`sms_queue` (
`Id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`Message` VARCHAR(160) NOT NULL DEFAULT 'Unknown Message Error',
`CurrentState` VARCHAR(10) NOT NULL DEFAULT 'None',
`Phone` VARCHAR(14) DEFAULT NULL,
`Created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
`TriesLeft` tinyint NOT NULL DEFAULT 3,
PRIMARY KEY (`Id`)
)
ENGINE = InnoDB;
Gagal dengan kesalahan berikut:
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.
Pertanyaan saya adalah, bisakah saya memiliki kedua bidang tersebut? atau apakah saya harus secara manual mengatur bidang LastUpdated selama setiap transaksi?
mysql
mysql-error-1293
Xenph Yan
sumber
sumber
Jawaban:
Dari dokumentasi MySQL 5.5 :
Perubahan pada MySQL 5.6.5 :
sumber
Changes in MySQL 5.6.5 (2012-04-10, Milestone 8) Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses. In addition, these clauses now can be used with DATETIME column definitions. For more information, see Automatic Initialization and Updating for TIMESTAMP and DATETIME.
Ada trik untuk memiliki kedua cap waktu, tetapi dengan sedikit batasan.
Anda hanya dapat menggunakan salah satu definisi dalam satu tabel. Buat kedua kolom stempel waktu seperti ini:
Perhatikan bahwa perlu masuk
null
ke dalam kedua kolom selamainsert
:sumber
stamp_created
itu juga diatur sebagai TIDAK NULL. MySQL akan secara otomatis mengganti NULL dengan cap waktu saat ini.stamp_created
bidang sebagai:stamp_created timestamp default now()
alih-alih menggunakan nilai 'NOL'?Anda dapat memiliki keduanya, lepas saja bendera "CURRENT_TIMESTAMP" di bidang yang dibuat. Setiap kali Anda membuat catatan baru di tabel, cukup gunakan "SEKARANG ()" untuk nilai.
Atau.
Sebaliknya, hapus bendera 'ON UPDATE CURRENT_TIMESTAMP' dan kirim SEKARANG () untuk bidang itu. Cara itu sebenarnya lebih masuk akal.
sumber
Jika Anda memutuskan untuk membuat MySQL menangani pembaruan cap waktu, Anda dapat mengatur pemicu untuk memperbarui bidang saat disisipkan.
Referensi MySQL: http://dev.mysql.com/doc/refman/5.0/id/triggers.html
sumber
Ini adalah bagaimana Anda dapat memiliki bidang createDate / lastModified otomatis & fleksibel menggunakan pemicu:
Pertama mendefinisikannya seperti ini:
Kemudian tambahkan pemicu ini:
Tapi inilah bagian yang bagus:
sumber
Pada MySQL 5.6 yang mudah-peasy ... coba saja:
sumber
Masalah ini sepertinya telah diselesaikan di MySQL 5.6. Saya perhatikan ini sampai MySQL 5.5; di sini adalah contoh kode:
Menjalankan ini di MySQL 5.5 memberi:
Menjalankan ini di MySQL 5.6
sumber
sumber: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
sumber
Untuk mysql 5.7.21 Saya menggunakan yang berikut ini dan berfungsi dengan baik:
CREATE TABLE
Posts
(modified_at
timestamp TIDAK NULL DEFAULT CURRENT_TIMESTAMP PADA PEMBARUAN CURRENT_TIMESTAMP,created_at
timestamp TIDAK NULL DEFAULT CURRENT_TIMESTAMP)sumber
saya pikir ini adalah permintaan yang lebih baik untuk stamp_created dan stamp_updated
karena ketika catatan dibuat,
stamp_created
harus diisi olehnow()
danstamp_updated
harus diisi oleh'0000-00-00 00:00:00'
sumber
Host web saya macet pada versi 5.1 dari mysql sehingga siapa pun seperti saya yang tidak memiliki opsi untuk meningkatkan dapat mengikuti petunjuk ini:
http://joegornick.com/2009/12/30/mysql-created-and-modified-date-fields/
sumber