ERROR 1067 (42000): Nilai default tidak valid untuk 'create_at'

105

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_atdan updated_at.

Berikut adalah struktur tabel saya:

masukkan deskripsi gambar di sini

iamsujit
sumber
apa nilai default untuk kolom ini? Bisakah Anda membagikan struktur tabel?
Priyanshu
@Priyanshu saya telah memperbarui struktur tabel saya
iamsujit
2
setel nilai default current_timestamp untuk dua kolom terakhir.
Priyanshu

Jawaban:

151

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';
Aman Aggarwal
sumber
7
Saya tahu ini, tetapi di server saya sql_mode kosong, Masih tidak berfungsi, saya menggunakan [Versi server: 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)]. Adakah yang bisa mendapatkan solusi apapun tanpa mengupgrade versi server?
Priyabrata Atha
sudahkah Anda memeriksa dengan perintah global? dan apakah tidak ada dalam sql_mode untuk sesi yang sama?
Aman Aggarwal
Saya memeriksa variabel acara seperti 'sql_mode'; dan hasilnya adalah Variable_name | Value = sql_mode |
Priyabrata Atha
2
Ini akan berguna untuk jawaban ini stackoverflow.com/questions/2317650/…
Preshan Pradeepa
4
Tidak berhasil untuk saya dengan 5.7. Tidak yakin apakah saya harus melakukannya secara global atau tidak.
Brett
99

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.

Ahmed Mohamed
sumber
itu luar biasa. Terima kasih bung!
Novasol
7
Terima kasih atas tipnya. Tetapi hanya menghapus batasan tanggal NO_ZERO_IN_DATE,NO_ZERO_DATEhanya 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';
KeitelDOG
1
Untuk klarifikasi, pernyataan ini harus digunakan hanya dalam pengembangan, bukan dalam produksi.
Ahmed Mohamed
29

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 = '';

Martin Mohan
sumber
1
SET sql_mode = '';sekarang sudah usang, SET GLOBAL sql_mode = ''oke
Vadim Anisimov
26

Coba 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_atdan updated_at. MySQL tidak menerima perintah Anda karena nilai untuk kolom ini tidak boleh kosong.

Semoga ini membantu.

Michele La Ferla
sumber
2
Terima kasih, suara positif, saya lebih suka solusi ini dalam kasus penggunaan saya
ChrisR
6

Dalam kasus saya, saya memiliki file untuk diimpor.
Jadi saya hanya menambahkan SET sql_mode = '';di awal file dan berhasil!

Tomás
sumber
5

Jalankan kueri ini:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

itu berhasil untuk saya

nyenius
sumber
ngomong-ngomong tidak perlu SET time_zone = "+00: 00";
Safak Ciplak
3

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;
  • Karena nilai TIMESTAMP disimpan sebagai Epoch Seconds, nilai timestamp '1970-01-01 00:00:00' (UTC) dicadangkan karena # 0 kedua digunakan untuk mewakili '0000-00-00 00:00:00 '.
  • Di MariaDB 5.5 dan sebelumnya, hanya ada satu kolom TIMESTAMP per tabel yang memiliki CURRENT_TIMESTAMP yang ditetapkan sebagai nilai defaultnya. Batas ini tidak lagi diterapkan sejak MariaDB 10.0.

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 []>
Bernd Buffen
sumber
3

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.

Bhushan
sumber
3

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)

  1. Tambahkan baris berikut ke repo MariaDB.

    nano /etc/yum.repos.d/mariadb.repo dan tempel baris berikut.

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1

  1. Hentikan MariaDB, jika sudah berjalan service mariadb stop
  2. Lakukan pembaruan

    yum update

  3. 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.

Hassaan
sumber
3
SET GLOBAL sql_mode = '';

Menyelesaikan masalah saya.

ondi gusho
sumber
2

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.

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

Sekarang restart mysql. Berhasil!

malajisi
sumber
0

Untuk Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

Hapus "([fsp])", menyelesaikan masalah saya.

imldp
sumber
0
  1. 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

    masukkan deskripsi gambar di sini

  2. 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]judul

    sql_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

  3. Mulai ulang server mysql

    $ /etc/init.d/mysql restart

Thushan
sumber