ข้อผิดพลาด 1067 (42000): ค่าเริ่มต้นไม่ถูกต้องสำหรับ 'created_at'


105

เมื่อฉันพยายามแก้ไขตารางมันแสดงข้อผิดพลาด:

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

ฉัน googled สำหรับข้อผิดพลาดนี้ แต่ทั้งหมดที่ฉันพบก็เหมือนกับว่าพวกเขาพยายามแก้ไขการประทับเวลาจึงเกิดขึ้น อย่างไรก็ตามที่นี่ฉันพยายามเพิ่มคอลัมน์ใหม่และฉันได้รับข้อผิดพลาดนี้:

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

และโต๊ะของฉันสองคอลัมน์สุดท้ายมีและcreated_atupdated_at

นี่คือโครงสร้างตารางของฉัน:

ใส่คำอธิบายภาพที่นี่


ค่าเริ่มต้นสำหรับคอลัมน์เหล่านี้คืออะไร คุณช่วยแชร์โครงสร้างตารางได้ไหม
Priyanshu

@Priyanshu ฉันได้อัปเดตโครงสร้างตารางของฉันแล้ว
iamsujit

2
ตั้งค่าเริ่มต้น current_timestamp สำหรับสองคอลัมน์สุดท้าย
Priyanshu

คำตอบ:


151

ปัญหาที่เกิดขึ้นเป็นเพราะsql_modes โปรดตรวจสอบ sql_modes ปัจจุบันของคุณด้วยคำสั่ง:

show variables like 'sql_mode' ; 

และลบ sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE " เพื่อให้ใช้งานได้ นี่คือ sql_mode เริ่มต้นใน mysql เวอร์ชันใหม่

คุณสามารถตั้งค่า sql_mode ทั่วโลกเป็นรูทโดยคำสั่ง:

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

7
ฉันรู้สิ่งนี้ แต่ในเซิร์ฟเวอร์ sql_mode ของฉันแสดงว่างเปล่ายังใช้งานไม่ได้ฉันกำลังใช้ [เวอร์ชันเซิร์ฟเวอร์: 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)] มีใครสามารถมีโซลูชันใด ๆ โดยไม่ต้องอัปเกรดเวอร์ชันเซิร์ฟเวอร์
Priyabrata Atha

คุณตรวจสอบตามคำสั่งส่วนกลางแล้วหรือยัง และไม่มีอะไรใน sql_mode สำหรับเซสชันเดียวกัน?
Aman Aggarwal

ฉันตรวจสอบตัวแปรแสดงเช่น 'sql_mode'; และผลลัพธ์คือ Variable_name | Value = sql_mode |
Priyabrata Atha

2
สิ่งนี้จะเป็นประโยชน์สำหรับคำตอบนี้stackoverflow.com/questions/2317650/…
Preshan Pradeepa

4
ไม่ได้ผลกับฉันกับ 5.7 ไม่แน่ใจว่าต้องทำทั่วโลกหรือไม่
Brett

100

ก่อนที่คุณจะเรียกใช้คำสั่งใด ๆ ให้ใส่สิ่งนี้ไว้ในบรรทัดแรก:

SET sql_mode = '';

โปรดทราบ:คำแถลงนี้ควรใช้ในการพัฒนาเท่านั้นไม่ใช่ในการผลิต


มันยอดเยี่ยมมาก ขอบใจเพื่อน!
Novasol

7
ขอบคุณสำหรับทิป. แต่การลบข้อ จำกัด วันที่NO_ZERO_IN_DATE,NO_ZERO_DATEเท่านั้นที่ทำให้เราสามารถรักษาคุณสมบัติด้านความปลอดภัยอื่น ๆ ได้:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
KeitelDOG

1
เพื่อความชัดเจนควรใช้ข้อความนี้ในการพัฒนาเท่านั้นไม่ใช่ในการผลิต
Ahmed Mohamed

29

ฉันพบข้อผิดพลาดเดียวกันขณะพยายามติดตั้งฐานข้อมูลของบุคคลที่สาม ฉันลองวิธีแก้ปัญหาที่เสนอไม่สำเร็จเช่น
SET sql_mode = '';

จากนั้นฉันลองใช้คำสั่งด้านล่างซึ่งใช้งานได้เพื่อให้สามารถติดตั้งฐานข้อมูลได้
SET GLOBAL sql_mode = '';


1
SET sql_mode = '';ตอนนี้เลิกใช้แล้วSET GLOBAL sql_mode = ''โอเค
Vadim Anisimov

26

ลองรันคำสั่งต่อไปนี้:

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

และ

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

สาเหตุที่คุณได้รับข้อผิดพลาดนี้เนื่องจากคุณไม่ได้ตั้งค่าเริ่มต้นสำหรับฟิลด์created_atและ updated_atMySQL ไม่ยอมรับคำสั่งของคุณเนื่องจากค่าสำหรับคอลัมน์เหล่านี้ไม่สามารถเป็นค่าว่างได้

หวังว่านี่จะช่วยได้


2
ขอบคุณเพิ่มคะแนนฉันชอบโซลูชันนี้ในกรณีการใช้งานของฉัน
ChrisR

6

ในกรณีของฉันฉันมีไฟล์ที่จะนำเข้า
ดังนั้นฉันจึงเพิ่มSET sql_mode = '';ที่จุดเริ่มต้นของไฟล์และใช้งานได้!


5

เรียกใช้แบบสอบถามนี้:

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

มันได้ผลสำหรับฉัน


ยังไงก็ไม่ต้อง SET time_zone = "+00: 00";
Safak Ciplak

3

คุณสามารถทำได้ดังนี้:

 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 ถูกจัดเก็บเป็น Epoch Seconds ค่าเวลาประทับ '1970-01-01 00:00:00' (UTC) จึงถูกสงวนไว้เนื่องจากใช้ # 0 ที่สองเพื่อแทน "0000-00-00 00:00:00 '.
  • ใน MariaDB 5.5 และก่อนหน้าจะมีคอลัมน์ TIMESTAMP ได้เพียงคอลัมน์เดียวต่อตารางที่มีการกำหนด CURRENT_TIMESTAMP เป็นค่าเริ่มต้น ขีด จำกัด นี้ใช้ไม่ได้อีกต่อไปตั้งแต่ MariaDB 10.0

ดู: https://mariadb.com/kb/en/mariadb/timestamp/

ตัวอย่าง

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

ฉันมีปัญหาที่คล้ายกัน ต่อไปนี้แก้ไขได้:

เปลี่ยนแปลง:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

ถึง:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

คือเพียง แต่เอาคำพูดรอบCURRENT_TIMESTAMP

หวังว่านี่จะช่วยใครบางคนได้


3

ดังที่กล่าวไว้ในคำตอบของ @Bernd Buffen นี่เป็นปัญหากับ MariaDB 5.5 ฉันอัปเกรด MariaDB 5.5 เป็น MariaDB 10.1 อย่างง่ายและแก้ไขปัญหาได้

นี่คือขั้นตอนในการอัพเกรด MariaDB 5.5 เป็น MariaDB 10.1 ที่ CentOS 7 (64-Bit)

  1. เพิ่มบรรทัดต่อไปนี้ใน MariaDB repo

    nano /etc/yum.repos.d/mariadb.repo และวางบรรทัดต่อไปนี้

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

  1. หยุด MariaDB ถ้าทำงานอยู่แล้ว service mariadb stop
  2. ดำเนินการอัปเดต

    yum update

  3. เริ่มต้น MariaDB และทำการอัพเกรด

    service mariadb start

    mysql_upgrade

ทุกอย่างเสร็จสิ้น

ตรวจสอบเวอร์ชัน MariaDB: mysql -V


หมายเหตุ : โปรดทำการสำรองฐานข้อมูลทุกครั้งก่อนทำการอัพเกรด ข้อมูลอาจสูญหายได้หากการอัปเกรดล้มเหลวหรือเกิดข้อผิดพลาด




2

สำหรับ Mysql5.7 ให้เข้าสู่ระบบในบรรทัดคำสั่ง mysql และรันคำสั่ง

mysql> show variables like 'sql_mode' ;

จะแสดงว่า NO_ZERO_IN_DATE, NO_ZERO_DATE ใน sql_mode

ใส่คำอธิบายภาพที่นี่

ลองเพิ่มบรรทัดด้านล่าง [mysqld] ในไฟล์ conf mysql ของคุณเพื่อลบสองตัวเลือกของฉัน (mysql 5.7 บน Ubuntu 16) คือ /etc/mysql/mysql.conf.d/mysqld.cnf

ใส่คำอธิบายภาพที่นี่

ตอนนี้รีสตาร์ท mysql มันได้ผล!


0

สำหรับ Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

ลบ "([fsp])" ออกเพื่อแก้ไขปัญหาของฉัน


0
  1. ขั้นแรกตรวจสอบว่าโหมดที่มีอยู่กำลังใช้คำสั่งต่อไปนี้ในเทอร์มินัลของคุณ:

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

    หรือ

    mysql> show variables like 'sql_mode';

    คุณจะเห็นผลลัพธ์ดังต่อไปนี้

    ใส่คำอธิบายภาพที่นี่

  2. ปิดโหมดผ่าน my.cnf: ในกรณีนี้คุณต้องลบโหมด NO_ZERO_IN_DATE, NO_ZERO_DATE

    เปิดไฟล์ my.cnf (โดยทั่วไปคุณจะพบไฟล์ my.cnf อยู่ใน /etc/my.cnf หรือ /etc/mysql/my.cnf)

    อัปเดตโหมดใน my.cnf ภายใต้[mysqld]หัวข้อ

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    ที่นี่ฉันได้ละเว้นโหมด NO_ZERO_IN_DATE, NO_ZERO_DATE

  3. รีสตาร์ทเซิร์ฟเวอร์ mysql

    $ /etc/init.d/mysql restart

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.