HATA 1067 (42000): 'created_at' için geçersiz varsayılan değer


102

Tabloyu değiştirmeye çalıştığımda şu hatayı gösterdi:

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

Bu hatayı araştırdım ama bulduğum tek şey zaman damgasını değiştirmeye çalışıyorlardı, böylece gerçekleşti. Ancak burada yeni bir sütun eklemeye çalışıyorum ve şu hatayı alıyorum:

mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'

ve tablomun son iki sütunu created_atve updated_at.

İşte benim tablo yapım:

görüntü açıklamasını buraya girin


bu sütunlar için varsayılan değerler nelerdir? Tablo yapısını paylaşır mısınız lütfen?
— Priyanshu

@Priyanshu Tablo yapımı güncelledim
— iamsujit

2
son iki sütun için varsayılan değer current_timestamp olarak ayarlayın.
— Priyanshu

Yanıtlar:


145

Sorun sql_modes'tan kaynaklanıyor . Lütfen mevcut sql_mode'larınızı komutla kontrol edin:

show variables like 'sql_mode' ; 

Ve çalışması için sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE " yi kaldırın . Bu, mysql yeni sürümlerindeki varsayılan sql_mode'dur.

Sql_mode'u global olarak root olarak aşağıdaki komutla ayarlayabilirsiniz:

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

7
Bunu biliyorum, ancak sql_mode sunucumda boş görünüyor, Hala çalışmıyor, [Server version: 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)] kullanıyorum. Herhangi biri sunucu sürümünü yükseltmeden herhangi bir çözüme sahip olabilir mi?
— Priyabrata Atha

global komutla kontrol ettiniz mi? ve aynı oturum için sql_mode'da hiçbir şey yok mu?
— Aman Aggarwal

'Sql_mode' gibi değişkenleri göstermeyi kontrol ettim; ve çıktı Variable_name | Value = sql_mode |
— Priyabrata Atha

2
Bu, bu cevap için faydalı olacaktır stackoverflow.com/questions/2317650/…
— Preshan Pradeepa

4
5.7 ile benim için çalışmadı. Bunu küresel olarak yapmam gerekip gerekmediğinden emin değilim.
— Brett

97

Basitçe, herhangi bir ifadeyi çalıştırmadan önce bunu ilk satıra koyun:

SET sql_mode = '';

bu sadece harikaydı. Teşekkürler ahbap!
— Novasol

7
Bahşiş için teşekkürler. Ama sadece tarih kısıtlamalarını kaldırarak NO_ZERO_IN_DATE,NO_ZERO_DATEbizi sadece diğer güvenlik özelliklerini korumak sağlar:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
— KeitelDOG

1
Açıklama için, bu ifade üretimde değil, yalnızca geliştirme aşamasında kullanılmalıdır.
— Ahmed Mohamed

Basit ve doğrudan konuya.
— Frank Fotangs

28

Üçüncü taraf bir veritabanı kurmaya çalışırken aynı hatayla karşılaştım. Önerilen çözümü başarısızlıkla denedim yani
SET sql_mode = '';

Ardından, veritabanının kurulmasına izin veren aşağıdaki komutu denedim
SET GLOBAL sql_mode = '';


1
SET sql_mode = '';artık kullanımdan kaldırıldı, SET GLOBAL sql_mode = ''TAMAM
— Vadim Anisimov

26

Aşağıdaki komutu deneyin ve çalıştırın:

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

ve

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

Bu hatayı almanızın nedeni, created_atve updated_atalanları için varsayılan bir değer belirlemiyor olmanızdır . MySQL, bu sütunların değerleri boş olamayacağı için komutunuzu kabul etmiyor.

Bu yardımcı olur umarım.


2
Teşekkürler, upvoted, benim kullanımı durumunda bu çözümü tercih
— ChrisR

5

Benim durumumda içe aktarmam gereken bir dosya var. Bu yüzden basitçe SET sql_mode = ''; dosyanın başında ve çalışıyor!


5

Bu sorguyu çalıştırın:

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

benim için çalışıyor


bu arada SET time_zone = "+00: 00" gerekmez;
— Şafak Çiplak

3

Bunu şu şekilde yapabilirsiniz:

 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;
  • TIMESTAMP değeri Epoch Seconds olarak saklandığından, '1970-01-01 00:00:00' (UTC) zaman damgası değeri rezerve edilir, çünkü ikinci # 0 '0000-00-00 00:00:00' ı temsil etmek için kullanılır. '.
  • MariaDB 5.5 ve öncesinde, tablo başına CURRENT_TIMESTAMP varsayılan değeri olarak tanımlanan yalnızca bir TIMESTAMP sütunu olabilirdi. Bu sınır, MariaDB 10.0'dan beri uygulanmamaktadır.

bkz: https://mariadb.com/kb/en/mariadb/timestamp/

örneklem

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

Benim de benzer bir problemim vardı. Bunu takiben çözüldü:

Değişiklik:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

to:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

yani, sadece CURRENT_TIMESTAMP etrafındaki alıntıları kaldırın .

Umarım bu birine yardımcı olur.


3

@Bernd Buffen'in cevabında belirtildiği gibi. Bu, MariaDB 5.5 ile ilgili bir sorundur, MariaDB 5.5'i MariaDB 10.1'e basitçe yükselttim ve sorun çözüldü.

İşte MariaDB 5.5'i CentOS 7'de (64-Bit) MariaDB 10.1'e yükseltme adımları

  1. MariaDB deposuna aşağıdaki satırları ekleyin.

    nano /etc/yum.repos.d/mariadb.repo ve aşağıdaki satırları yapıştırın.

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

  1. Zaten çalışıyorsa MariaDB'yi durdurun service mariadb stop
  2. Güncelleme gerçekleştir

    yum update

  3. MariaDB'yi Başlatma ve Yükseltmeyi Gerçekleştirme

    service mariadb start

    mysql_upgrade

Her şey bitti.

MariaDB sürümünü kontrol edin: mysql -V


NOT : Yükseltme yapmadan önce lütfen Veritabanlarının yedeğini alın. Yükseltme başarısız olursa veya bir şeyler ters giderse veriler kaybolabilir.




2

Mysql5.7 için mysql komut satırında oturum açın ve komutu çalıştırın,

mysql> show variables like 'sql_mode' ;

Sql_mode'da NO_ZERO_IN_DATE, NO_ZERO_DATE olduğunu gösterecektir.

görüntü açıklamasını buraya girin

İki seçeneği kaldırmak için mysql conf dosyanızın [mysqld] altına bir satır eklemeyi deneyin, benimki (Ubuntu 16'da mysql 5.7) /etc/mysql/mysql.conf.d/mysqld.cnf

görüntü açıklamasını buraya girin

Şimdi mysql'yi yeniden başlatın. İşe yarıyor!


0

Mysql8.0.18 için:

CURRENT_TIMESTAMP([fsp])

"([Fsp])" öğesini kaldırın, sorunumu çözdü.


0
  1. Öncelikle, mevcut modların terminalinizde aşağıdaki komutu kullandığını kontrol edin:

    $ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

    veya

    mysql> show variables like 'sql_mode';

    Aşağıdaki gibi bir çıktı göreceksiniz

    görüntü açıklamasını buraya girin

  2. My.cnf aracılığıyla modları devre dışı bırakın: Bu durumda, NO_ZERO_IN_DATE, NO_ZERO_DATE modlarını kaldırmanız gerekir

    My.cnf dosyasını açın (Genellikle /etc/my.cnf veya /etc/mysql/my.cnf'de bulunan my.cnf dosyasını bulabilirsiniz)

    My.cnf dosyasında [mysqld]başlık altında güncelleme modları

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    Burada NO_ZERO_IN_DATE, NO_ZERO_DATE modlarını atladım

  3. Mysql sunucusunu yeniden başlatın

    $ /etc/init.d/mysql restart

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.