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


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

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.


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


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.


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!


5

Jalankan kueri ini:

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

itu berhasil untuk saya


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 []>

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.


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.




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!


0

Untuk Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.