Nilai default tidak valid untuk bidang cap waktu 'create_date'

186

Saya punya pernyataan buat sql berikut

mysql> CREATE  TABLE IF NOT EXISTS `erp`.`je_menus` (
    ->   `id` INT(11) NOT NULL AUTO_INCREMENT ,
    ->   `name` VARCHAR(100) NOT NULL ,
    ->   `description` VARCHAR(255) NOT NULL ,
    ->   `live_start_date` DATETIME NULL DEFAULT NULL ,
    ->   `live_end_date` DATETIME NULL DEFAULT NULL , 
    ->   `notes` VARCHAR(255) NULL ,
    ->   `create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
    ->   `created_by` INT(11) NOT NULL ,
    ->   `update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,
    ->   `updated_by` INT(11) NOT NULL , 
    ->   `status` VARCHAR(45) NOT NULL ,
    ->   PRIMARY KEY (`id`) ) 
    -> ENGINE = InnoDB;

memberikan kesalahan berikut

ERROR 1067 (42000): Invalid default value for 'create_date'

Apa kesalahannya di sini?

robert
sumber
Saya tidak dapat melihat ada yang salah dengan permintaan Anda dan berfungsi pada komunitas 5.1.50 yang baru saja diuji.
Jaspreet Chahal
Kueri juga oke untuk saya.
Shakti Singh
Tidak Yakin tetapi berikan nama yang berbeda untuk bidang itu dan coba?
Naveen Kumar
saya menggunakan komunitas mysql 5.1.56 di ubuntu 10.04. dan tidak bekerja
robert
5
Tanggal no nol memerlukan tanggal. Gunakan '1970-01-01 00:00:01'. [diambil dari sini] [1] [1]: dba.stackexchange.com/questions/6171/…
Jadeye

Jawaban:

176

Itu karena Mode SQL server - NO_ZERO_DATE .

Dari referensi: NO_ZERO_DATE- Dalam mode ketat, jangan izinkan '0000-00-00'sebagai tanggal yang valid. Anda masih dapat memasukkan tanggal nol dengan opsi IGNORE . Ketika tidak dalam mode ketat, tanggal diterima tetapi peringatan dihasilkan.

Devart
sumber
19
bagaimana cara saya memberikan opsi abaikan?
robert
9
Anda tidak dapat mengabaikan opsi ini. Ini adalah opsi server. Jika Anda memiliki akses ke my.ini (file konfigurasi mysql), maka hapus NO_ZERO_DATE dari opsi mode sql dan restart server.
Devart
7
Untuk memeriksa opsi ini - jalankan SHOW VARIABLES LIKE 'sql_mode'
Devart
6
saya membuat skrip menggunakan meja kerja mysql. Dalam skrip, sql_mode diatur ke tradisional. Jika saya menghapus tradisional, skrip berfungsi.
robert
17
Di preferensi MySQL Workbench, buka tab 'Model: MySQL'. Di sana set 'SQL_MODE yang akan digunakan dalam skrip yang dihasilkan' ke "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION" Yang memecahkan masalah untuk selamanya.
sgtdck
140

Jika Anda membuat skrip dari meja kerja MySQL.

Baris berikut dihasilkan

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

Hapus TRADITIONAL dari SQL_MODE, dan kemudian skrip akan berfungsi dengan baik

Selain itu, Anda dapat mengatur SQL_MODE sebagai Izinkan Tanggal Tidak Valid

SET SQL_MODE='ALLOW_INVALID_DATES';
Pankaj Shrestha
sumber
1
Menyelamatkan saya beberapa saat mencari mengapa sih tidak bekerja :)
Srneczek
5
Ahhh terima kasih. SET SQL_MODE = 'ALLOW_INVALID_DATES'; adalah penyelamat. Saya memiliki masalah ini ketika saya melakukan migrasi situs wordpress ke server lain (keduanya lokal) dan tidak akan membiarkan saya mengimpor data database karena kesalahan ini, meskipun tidak ada baris dalam tabel dengan kesalahan ini.
mikato
Bekerja seperti pesona! Terima kasih.
moreirapontocom
52

TIMESTAMP memiliki rentang '1970-01-01 00:00:01' UTC hingga '2038-01-19 03:14:07' UTC (lihat dokumen ). Nilai default harus dalam kisaran itu.

Perilaku aneh, terkait, lainnya:

CREATE TABLE tbl1 (
    ts TIMESTAMP);  
Query OK, 0 rows affected (0.01 sec)

CREATE TABLE tbl2 (
    ts TIMESTAMP,
    ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'

CREATE TABLE tbl3 (
    ts TIMESTAMP,
    ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)

Catatan, jika Anda ingin memasukkan NULLS:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);
Bret VvVv
sumber
1
Ini sedang terjadi pada saya. Apa yang sedang terjadi? ts2 bahkan bukan "TIDAK NULL" ...!
PedroD
2
Mungkin karena "Jika Anda tidak menetapkan nilai untuk kolom TIMESTAMP pertama dalam sebuah tabel, MariaDB akan secara otomatis menetapkannya tanggal dan waktu saat ini ketika melakukan permintaan UPDATE atau INSERT pada baris yang dipertanyakan." - MariaDB Docs
jsphpl
1
Saya suka penggunaan column_name TIMESTAMP DEFAULT NOW(). Mungkin tidak sesuai untuk setiap situasi tetapi saya pikir saya akan berbagi karena saya berurusan dengan ini juga.
DeezCashews
1
column_name TIMESTAMP DEFAULT '1970-01-01 00:00:01' berhasil untuk saya. Terima kasih!
metafa
42

Di ubuntu desktop 16.04, saya melakukan ini:

  1. buka file: /etc/mysql/mysql.conf.d/mysqld.cnfdi editor pilihan Anda.

  2. Cari:, sql_modeitu akan berada di suatu tempat di bawah [mysqld].

  3. dan atur sql_modesebagai berikut:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. Simpan dan mulai kembali layanan mysql dengan melakukan:

    sudo service mysql restart

Mubashar Abbas
sumber
8
Itu memang membantu, kecuali bahwa sql_modetidak ada untuk contoh mySQL saya di ubuntu16.04. Saya harus menambahkan entri untuk itu dalam file, dengan menghapus "NO_ZERO_DATE". Jadi, di sini adalah bagaimana tampak sekarang: #Adding di bawah garis untuk menyingkirkan no_zero_date sql_mode = ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
OK999
Anda benar .. Saya menambahkan itu sebelumnya untuk menonaktifkan mode ketat .. dan ketika saya mengeditnya untuk masalah khusus ini, sql_modeentri sudah ada di sana.
Mubashar Abbas
Apakah ini bug? CURRENT_TIMESTAMP tidak boleh mengembalikan "0000-00-00 00:00:00", atau saya salah? Mengapa saya harus mengubah pengaturan mysqld?
letsjump
@letsjump karena seseorang mengkonfigurasi server mysql Anda secara tidak benar. Saya mengenai masalah ini dengan database yang saya impor. nilai default untuk cap waktu di kolom bukan nilai cap waktu yang valid. perbaikan NYATA adalah untuk memperbarui stempel waktu default ke sesuatu yang valid seperti tahun 1970 - tanggal paling awal yang tersedia. Solusi sementara adalah menonaktifkan pemeriksaan pada database.
anon58192932
9

Menggunakan OS X , instal mysql dari Homebrew , System Variables berdasarkan pada default yang dikompilasi. Solusinya adalah menghapus "NO_ZERO_DATE" dari Variabel Sistem "sql_mode".

Hanya perlu diingat bahwa ruang lingkup melibatkan.

Jika Anda hanya ingin memengaruhi sesi Anda, silakan gunakan "@@session", Misalnya:

SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

Dalam hal ini, itu tidak akan memengaruhi begitu sesi Anda berakhir atau mengubahnya. Itu tidak berpengaruh pada sesi lain.

Jika Anda ingin memengaruhi semua klien, silakan gunakan "@@global", misalnya:

SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

Dalam hal ini, itu hanya mempengaruhi klien yang terhubung setelah perubahan (tidak mempengaruhi semua klien saat ini), dan tidak akan berfungsi setelah server keluar.

Joy Zhu
sumber
8

Saya dapat mengatasi masalah ini pada OS X dengan menginstal MySQL dari Homebrew

brew install mysql

dengan menambahkan berikut ini ke /usr/local/etc/my.cnf

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

dan me-restart MySQL

brew tap homebrew/services
brew services restart mysql
dgitman
sumber
7

Saya punya masalah serupa dengan MySQL 5.7 dengan kode berikut:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Saya memperbaiki dengan menggunakan ini sebagai gantinya:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

pyb
sumber
2
Saya pikir ini sebenarnya pilihan terbaik ketika masuk akal untuk default ke saat ini, namun tidak masuk akal untuk cap waktu lahir - hanya sebagai contoh.
mengeong
7

Untuk menghindari masalah ini, Anda perlu menghapus NO_ZERO_DATEdari konfigurasi mode mysql.

  1. Pergi ke 'phpmyadmin'.
  2. Setelah phpmyadmin dimuat, klik tab 'variabel'.
  3. Cari 'mode sql'.
  4. Klik pada opsi Edit dan hapus NO_ZERO_DATE(dan koma yang tertinggal) dari konfigurasi.

Ini adalah masalah yang sangat umum di lingkungan lokal dengan wamp atau xamp.

Antonio Reyes
sumber
6

Tentukan baris berikut di atas file SQL Database Anda.

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

Ini bekerja untuk saya.

Ashish Odich
sumber
2

Untuk menonaktifkan mode SQL yang ketat

Create disable_strict_mode.cnf file at /etc/mysql/conf.d/

Dalam file tersebut, masukkan dua baris ini:

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Terakhir, restart MySQL dengan perintah ini:

sudo service mysql restart
Jatin Bhatti
sumber
1

Anda mungkin ingin memeriksa pengaturan zona waktu pada instance MySql:

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

dalam kasus saya, saya menyadari bahwa sistem yang mendasari menetapkan zona waktu untuk BST daripada UTC, dan dalam tabel buat default '1970-01-01 00:00:01' dipaksa kembali 1 jam, menghasilkan nilai cap waktu yang tidak valid.

Bagi saya, saya benar-benar menginginkan zona waktu mesin diatur ke UTC, dan hal itu menyurutkan saya. Ketika saya menjalankan Centos / 7, saya hanya melakukannya

# timedatectl set-timezone UTC

dan memulai kembali semuanya.

Robert Hook
sumber
1

Nilai default harus dimulai dari tahun 1000.

Sebagai contoh,

ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'

Semoga ini bisa membantu seseorang.

David Beckwith
sumber
1

Ubah ini:

`create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,

Berikut ini:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
荒木 知
sumber
1
Dari Ulasan: Hai, tolong jangan jawab hanya dengan kode sumber. Cobalah untuk memberikan deskripsi yang bagus tentang cara kerja solusi Anda. Lihat: Bagaimana saya menulis jawaban yang baik? . Terima kasih
sɐunıɔ ןɐ qɐp
Jika ini adalah situs WordPress, mohon jangan perbarui tabel Core WordPress. Banyak plugin mengharapkan nilai zeores, jadi WordPress tidak dapat mengubah nilai default ini karena alasan lama yang akan merusak plugin. Utas Wordpress dan dukungan Wordpress . Mengubah struktur basis data tanpa memahami kode yang mengandalkan nilai default dapat menyebabkan bug yang mengganggu. Meskipun ini dapat berfungsi sebagai solusi dalam banyak kasus, ini bisa menghancurkan havock di orang lain. Bukan solusi universal.
SherylHohman
0

Anda bisa mengubah ini:

`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

Untuk sesuatu seperti ini:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',
Lucas Bustamante
sumber
0

Anda bisa mengubah ini:

create_date datetime TIDAK NULL DEFAULT '0000-00-00 00:00:00',

Untuk sesuatu seperti ini:

create_date varchar (80) BUKAN NULL DEFAULT '0000-00-00 00:00:00',

Ankush Singhal
sumber