'Create_date' zaman damgası alanı için geçersiz varsayılan değer


186

Aşağıdaki sql create deyim var

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;

aşağıdaki hatayı vermek

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

Buradaki hata nedir?


Sorgunuzla ilgili yanlış bir şey göremiyorum ve yeni test edilen 5.1.50 topluluğunda çalışıyor.
Jaspreet Chahal

Sorgu sonunda benim de sorun değil.
Shakti Singh

Emin değilim ama o alana farklı bir isim verin ve deneyin?
Naveen Kumar

Ben ubuntu 10.04 mysql 5.1.56 topluluk kullanın. and not not
Robert

5
Sıfır olmayan tarih bir tarih gerektirir. '1970-01-01 00:00:01' kullanın. [buradan alınır] [1] [1]: dba.stackexchange.com/questions/6171/…
Jadeye

Yanıtlar:


176

Bunun nedeni sunucu SQL Modu - NO_ZERO_DATE .

Referanstan: NO_ZERO_DATE- Katı modda, '0000-00-00'geçerli bir tarih olarak izin vermeyin . IGNORE seçeneğiyle yine de sıfır tarih ekleyebilirsiniz . Katı modda değilken, tarih kabul edilir, ancak bir uyarı oluşturulur.


19
yoksay seçeneğini nasıl verebilirim?
robert

9
Bu seçeneği göz ardı edemezsiniz. Bu sunucu seçeneğidir. My.ini'ye (mysql yapılandırma dosyası) erişiminiz varsa, NO_ZERO_DATE'i sql-mode seçeneğinden kaldırın ve sunucuyu yeniden başlatın.
Devart

7
Bu seçeneği işaretlemek için - 'sql_mode' GİBİ DEĞİŞKENLERİ GÖSTER
Devart

6
mysql tezgah kullanarak komut dosyası oluşturdu. Kodda sql_mode geleneksel olarak ayarlanmıştır. Ben geleneksel kaldırmak, komut dosyası çalışır.
Robert

17
MySQL Workbench tercihlerinde 'Model: MySQL' sekmesine gidin. 'Oluşturulan komut dosyalarında kullanılacak' SQL_MODE 'ayarını "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION" olarak ayarlayın.
sgtdck

140

Komut dosyasını MySQL çalışma tezgahından oluşturduysanız.

Aşağıdaki satır oluşturulur

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

TRADITIONAL'ı SQL_MODE'dan kaldırın ve komut dosyasının iyi çalışması gerekir

Aksi takdirde, SQL_MODE'u Geçersiz Tarihlere İzin Ver olarak ayarlayabilirsiniz

SET SQL_MODE='ALLOW_INVALID_DATES';

1
Bana neden cehennem çalışmıyor arama biraz zaman
kurtardı

5
Ahhh teşekkür ederim. SET SQL_MODE = 'ALLOW_INVALID_DATES'; hayat kurtarıcıydı. Ben bir wordpress sitesi başka bir sunucuya (her ikisi de yerel) geçirme trie zaman bu sorun vardı ve düz-se bile bu hata ile tablolarda satırlar vardı, bu hata nedeniyle veritabanı verileri almak bana izin vermedi.
mikato

Bir cazibe gibi çalıştı! Teşekkür ederim.
moreirapontocom

52

TIMESTAMP '1970-01-01 00:00:01' UTC'den '2038-01-19 03:14:07' UTC'ye sahiptir ( dokümana bakınız) ). Varsayılan değer bu aralık içinde olmalıdır.

Diğer garip, ilgili, davranış:

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)

Yan not, NULLS eklemek istiyorsanız:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

1
Bu benim başıma geliyor. Neler oluyor? ts2 bile "NULL DEĞİL" ...!
PedroD

2
"Bir tablodaki ilk TIMESTAMP sütunu için bir değer ayarlamazsanız, MariaDB, söz konusu satır (lar) da bir GÜNCELLEME veya INSERT sorgusu gerçekleştirirken buna otomatik olarak geçerli tarih ve saati atayacaktır." - MariaDB Belgeleri
jsphpl

1
Ben kullanımını seviyorum column_name TIMESTAMP DEFAULT NOW(). Her durum için uygun olmayabilir, ancak bununla uğraştığımdan beri paylaşacağımı düşündüm.
DeezCashews

1
column_name TIMESTAMP VARSAYILAN '1970-01-01 00:00:01' benim için hile yaptı. Teşekkürler!
metafa

42

Ubuntu masaüstü 16.04'te şunu yaptım:

  1. açık dosya: /etc/mysql/mysql.conf.d/mysqld.cnfseçtiğiniz bir düzenleyicide.

  2. Bakın:, sql_modealtında bir yerde olacak [mysqld].

  3. ve sql_modeaşağıdakilere ayarlayın :

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. Kaydedin ve sonra mysql hizmetini yaparak yeniden başlatın:

    sudo service mysql restart


8
sql_modeUbuntu16.04 üzerinde mySQL örneğim için orada olması dışında yardımcı oldu . Ben "NO_ZERO_DATE" kaldırarak, dosya için bir girdi eklemek zorunda kaldı. Yani, burada şimdi böyle görünüyor: sınırının altında #Adding 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 kurtulmak
OK999

haklısın ... Daha önce katı modu devre dışı bırakmak için ekledim .. ve bu sorun için düzenlediğimde, sql_modegiriş zaten oradaydı.
Mübarek Abbas

Bu bir hata mı? CURRENT_TIMESTAMP asla "0000-00-00 00:00:00" döndürmemelidir, yoksa yanılıyorum? Neden mysqld ayarlarını değiştirmek zorundayım?
letsjump

@letsjump çünkü birisi mysql sunucunuzu yanlış yapılandırdı. Ben ithal bir veritabanı ile bu sorunu vuruyorum. bir sütundaki zaman damgası için varsayılan değer geçerli bir zaman damgası değeri değildir. GERÇEK düzeltme, varsayılan zaman damgasını 1970 gibi geçerli bir şeye güncellemektir - en erken tarih. Geçici çözüm, veritabanındaki denetimi devre dışı bırakmaktır.
anon58192932

9

OS X kullanarak , derlenmiş varsayılanlarına göre Homebrew , Sistem Değişkenleri'nden mysql yükleyin . Çözüm "NO_ZERO_DATE" Sistem Değişkenleri "sql_mode" kaldırmaktır.

Lütfen kapsamın içerdiğini unutmayın.

Yalnızca oturumunuzda etkilemek istiyorsanız, lütfen şunu kullanın "@@session": Örneğin:

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

Bu durumda, oturumunuz bittikten veya değiştirdiğinizde etkilenmez. Diğer oturum üzerinde etkisi yoktur.

Tüm istemcileri etkilemek istiyorsanız, lütfen şunu kullanın "@@global":

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

Bu durumda, yalnızca değişiklikten sonra bağlanan istemcileri etkiler (geçerli tüm istemcileri etkilemez) ve sunucu çıktıktan sonra çalışmaz.


8

Homebrew'dan MySQL'i yükleyerek OS X'te bu sorunu çözebildim

brew install mysql

/usr/local/etc/my.cnf dosyasına aşağıdakileri ekleyerek

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

ve MySQL'i yeniden başlatma

brew tap homebrew/services
brew services restart mysql

7

Aşağıdaki kod ile MySQL 5.7 ile benzer bir sorun vardı:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Bunun yerine kullanarak sabit:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
Bence bu aslında akıma varsayılan gelmesi mantıklı olduğunda en iyi seçenektir, ancak doğum zaman damgası için mantıklı olmaz - sadece örnek olarak.
Miyav

7

Bu sorunu önlemek için NO_ZERO_DATE, mysql modu yapılandırmasından kaldırmanız gerekir .

  1. 'Phpmyadmin' adresine gidin.
  2. Phpmyadmin yüklendikten sonra, 'değişkenler' sekmesine tıklayın.
  3. 'Sql mode' için arama yapın.
  4. Düzenle seçeneğini tıklayın ve NO_ZERO_DATE(ve sondaki virgül) yapılandırmadan kaldırın .

Bu, wamp veya xamp ile yerel ortamda çok yaygın bir konudur.


6

Veritabanı SQL dosyanızın üst kısmında aşağıdaki satırları tanımlamanız yeterlidir.

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

Benim için çalışıyor.


2

Sıkı SQL modunu devre dışı bırakmak için

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

Dosyaya şu iki satırı girin:

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

Son olarak, MySQL'i şu komutla yeniden başlatın:

sudo service mysql restart

1

MySql örneğindeki saat dilimi ayarını incelemek isteyebilirsiniz:

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

Benim durumumda, temel sistemin saat dilimi UTC yerine BST olarak ayarlandığını fark ettim ve bu nedenle oluşturma tablosunda varsayılan olarak '1970-01-01 00:00:01' varsayılan 1 saat geri zorlandı ve sonuç olarak geçersiz bir zaman damgası değeri.

Benim için, aslında makinenin saat diliminin UTC'ye ayarlanmasını istedim ve bu beni halletti. Centos / 7'yi çalıştırırken,

# timedatectl set-timezone UTC

ve her şeyi yeniden başlattı.


1

Varsayılan değerler 1000 yılından başlamalıdır.

Örneğin,

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

Umarım bu birine yardımcı olur.


1

Bunu değiştir:

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

Aşağıdakilere:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

1
Yorumdan: Merhaba, lütfen kaynak koduyla cevap vermeyin. Çözümünüzün nasıl çalıştığı hakkında güzel bir açıklama sağlamaya çalışın. Bkz: İyi bir cevabı nasıl yazarım? . Thanks
sɐunıɔ ןɐ qɐp

Bu bir WordPress sitesi ise, lütfen Temel WordPress tablolarını güncellemeyin. Birçok eklenti bir zeores değeri bekler, bu nedenle WordPress eklentileri bozacak eski nedenlerle bu varsayılan değeri değiştiremez. Wordpress iş parçacığı ve Wordpress desteği . Varsayılan değerlere dayanan bir kod bilgisi olmadan veritabanı yapısının değiştirilmesi, sorunlara yol açabilir. Bu birçok durumda bir çözüm olarak çalışabilirken, diğerlerinde havock'u mahvedebilir. Evrensel bir çözüm değil.
SherylHohman

0

Bunu sadece değiştirebilirsiniz:

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

Böyle bir şeye:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',

0

Bunu sadece değiştirebilirsiniz:

create_date datetime NULL DEFAULT DEĞİL '0000-00-00 00:00:00',

Böyle bir şeye:

create_date varchar (80) NULL DEFAULT DEĞİL '0000-00-00 00:00:00',

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.