Ketika saya mencoba untuk mengubah tabel itu menunjukkan kesalahan:
ERROR 1067 (42000): Invalid default value for 'created_at'
Saya mencari kesalahan ini di Google tetapi yang saya temukan adalah seolah-olah mereka mencoba mengubah stempel waktu sehingga itu terjadi. Namun di sini saya mencoba menambahkan kolom baru dan saya mendapatkan kesalahan ini:
mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'
dan dua kolom terakhir tabel saya adalah created_at
dan updated_at
.
Berikut adalah struktur tabel saya:
Jawaban:
Masalahnya adalah karena sql_modes . Silakan periksa sql_modes Anda saat ini dengan perintah:
show variables like 'sql_mode' ;
Dan hapus sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE " untuk membuatnya bekerja. Ini adalah sql_mode default di versi baru mysql.
Anda dapat mengatur sql_mode secara global sebagai root dengan perintah:
set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
sumber
Sederhananya, sebelum Anda menjalankan pernyataan apa pun, letakkan ini di baris pertama:
SET sql_mode = '';
HARAP DICATAT: pernyataan ini harus digunakan hanya dalam pengembangan, bukan dalam produksi.
sumber
NO_ZERO_IN_DATE,NO_ZERO_DATE
hanya memungkinkan kami untuk mempertahankan fitur keamanan lainnya:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Saya menemukan kesalahan yang sama saat mencoba menginstal database pihak ketiga. Saya mencoba solusi yang diusulkan tidak berhasil yaitu
SET sql_mode = '';
Kemudian saya mencoba perintah di bawah ini yang berfungsi memungkinkan database untuk diinstal
SET GLOBAL sql_mode = '';
sumber
SET sql_mode = '';
sekarang sudah usang,SET GLOBAL sql_mode = ''
okeCoba dan jalankan perintah berikut:
ALTER TABLE `investments` MODIFY created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;
dan
ALTER TABLE `investments` MODIFY updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;
Alasan Anda mendapatkan kesalahan ini adalah karena Anda tidak menyetel nilai default untuk bidang
created_at
danupdated_at
. MySQL tidak menerima perintah Anda karena nilai untuk kolom ini tidak boleh kosong.Semoga ini membantu.
sumber
Dalam kasus saya, saya memiliki file untuk diimpor.
Jadi saya hanya menambahkan
SET sql_mode = '';
di awal file dan berhasil!sumber
Jalankan kueri ini:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00";
itu berhasil untuk saya
sumber
Anda bisa melakukannya seperti ini:
CREATE TABLE `ttt` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `t1` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00', `t2` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00', `t3` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00', `t4` TIMESTAMP NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;
lihat: https://mariadb.com/kb/en/mariadb/timestamp/
Sampel
MariaDB []> insert into ttt (id) VALUES (1),(2),(3); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 MariaDB []> select * from ttt; +----+---------------------+---------------------+---------------------+---------------------+ | id | t1 | t2 | t3 | t4 | +----+---------------------+---------------------+---------------------+---------------------+ | 1 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 2 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 3 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +----+---------------------+---------------------+---------------------+---------------------+ 3 rows in set (0.00 sec) MariaDB []>
sumber
Saya punya masalah serupa. Berikut memecahkannya:
Perubahan:
recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',
untuk:
recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
yaitu, hapus saja tanda kutip di sekitar CURRENT_TIMESTAMP .
Semoga ini bisa membantu seseorang.
sumber
Seperti yang disebutkan dalam jawaban @Bernd Buffen. Ini masalah dengan MariaDB 5.5, saya hanya mengupgrade MariaDB 5.5 ke MariaDB 10.1 dan masalah terselesaikan.
Berikut Langkah-langkah untuk meningkatkan MariaDB 5.5 menjadi MariaDB 10.1 di CentOS 7 (64-Bit)
Tambahkan baris berikut ke repo MariaDB.
nano /etc/yum.repos.d/mariadb.repo
dan tempel baris berikut.service mariadb stop
Lakukan pembaruan
yum update
Memulai MariaDB & Melakukan Upgrade
service mariadb start
mysql_upgrade
Semuanya Selesai.
Periksa versi MariaDB:
mysql -V
CATATAN : Harap selalu membuat cadangan Database sebelum melakukan peningkatan. Data dapat hilang jika peningkatan gagal atau terjadi kesalahan.
sumber
SET GLOBAL sql_mode = '';
Menyelesaikan masalah saya.
sumber
Ubah saja dengan baris ini:
untuk tabel baru:
CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
untuk Tabel yang Ada:
Alter ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Sumber:
https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html
sumber
Untuk Mysql5.7, login di baris perintah mysql dan jalankan perintah,
mysql> show variables like 'sql_mode' ;
Ini akan menunjukkan bahwa NO_ZERO_IN_DATE, NO_ZERO_DATE dalam sql_mode.
Coba tambahkan baris di bawah [mysqld] di file conf mysql Anda untuk menghapus dua opsi, milik saya (mysql 5.7 di Ubuntu 16) adalah /etc/mysql/mysql.conf.d/mysqld.cnf
Sekarang restart mysql. Berhasil!
sumber
Untuk Mysql8.0.18:
Hapus "([fsp])", menyelesaikan masalah saya.
sumber
Pertama, periksa mode yang ada menggunakan perintah berikut di terminal Anda:
$ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"
atau
mysql> show variables like 'sql_mode';
Anda akan melihat output seperti di bawah ini
Nonaktifkan mode melalui my.cnf: Dalam kasus ini, Anda perlu menghapus mode NO_ZERO_IN_DATE, NO_ZERO_DATE
Buka file my.cnf (Umumnya Anda dapat menemukan file my.cnf terletak di /etc/my.cnf atau /etc/mysql/my.cnf)
Perbarui mode di my.cnf di bawah
[mysqld]
judulsql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Di sini saya telah menghilangkan mode NO_ZERO_IN_DATE, NO_ZERO_DATE
Mulai ulang server mysql
$ /etc/init.d/mysql restart
sumber