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.