ค่าเริ่มต้นไม่ถูกต้องสำหรับเขตข้อมูลประทับเวลา 'create_date'


186

ฉันมีคำสั่ง sql สร้างต่อไปนี้

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;

ให้ข้อผิดพลาดดังต่อไปนี้

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

ข้อผิดพลาดที่นี่คืออะไร


ฉันไม่เห็นอะไรผิดปกติกับแบบสอบถามของคุณและใช้งานได้กับชุมชนที่เพิ่งทดสอบ 5.1.50
Jaspreet Chahal

แบบสอบถามก็ไม่เป็นไรในตอนท้ายของฉันเช่นกัน
Shakti Singh

ไม่แน่ใจ แต่ให้ชื่ออื่นกับเขตข้อมูลนั้นแล้วลอง?
Naveen Kumar

ฉันใช้ mysql 5.1.56 community ใน ubuntu 10.04 และไม่ทำงาน
เบิร์ต

5
วันที่ไม่มีศูนย์ต้องใช้วันที่ ใช้ '1970-01-01 00:00:01' [นำมาจากที่นี่] [1] [1]: dba.stackexchange.com/questions/6171/…
Jadeye

คำตอบ:


176

นั่นเป็นเพราะโหมดเซิร์ฟเวอร์ SQL - NO_ZERO_DATE

จากการอ้างอิง: NO_ZERO_DATE- ในโหมดเข้มงวดไม่อนุญาตให้'0000-00-00'เป็นวันที่ที่ถูกต้อง คุณยังสามารถแทรกวันที่เป็นศูนย์ด้วยตัวเลือกIGNORE เมื่อไม่อยู่ในโหมดเข้มงวดระบบจะยอมรับวันที่ แต่จะมีการสร้างคำเตือน


19
ฉันจะให้ตัวเลือกไม่สนใจได้อย่างไร
เบิร์ต

9
คุณไม่สามารถละเว้นตัวเลือกนี้ นี่คือตัวเลือกเซิร์ฟเวอร์ หากคุณเข้าถึง my.ini (ไฟล์กำหนดค่า mysql) ให้ลบ NO_ZERO_DATE ออกจากตัวเลือก sql-mode และรีสตาร์ทเซิร์ฟเวอร์
Devart

7
ในการตรวจสอบตัวเลือกนี้ - รัน SHOW VARIABLES LIKE 'sql_mode'
Devart

6
ฉันสร้างสคริปต์โดยใช้ mysql workbench ในสคริปต์ sql_mode ถูกตั้งค่าเป็นแบบดั้งเดิม หากฉันลบแบบดั้งเดิมสคริปต์จะทำงาน
เบิร์ต

17
ในการตั้งค่า MySQL Workbench ไปที่แท็บ 'รุ่น: MySQL' มีการตั้งค่า 'SQL_MODE ที่จะใช้ในสคริปต์ที่สร้าง' เป็น "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION" ที่ช่วยแก้ปัญหาให้ดี
sgtdck

140

หากคุณสร้างสคริปต์จาก MySQL workbench

บรรทัดต่อไปนี้ถูกสร้างขึ้น

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

ลบ TRADITIONAL ออกจาก SQL_MODE จากนั้นสคริปต์ควรทำงานได้ดี

มิฉะนั้นคุณสามารถตั้งค่า SQL_MODE เป็นอนุญาตวันที่ไม่ถูกต้อง

SET SQL_MODE='ALLOW_INVALID_DATES';

1
บันทึกฉันค้นหาบางเวลาทำไมนรกจะไม่ทำงาน :)
Srneczek

5
Ahhh ขอบคุณ SET SQL_MODE = 'ALLOW_INVALID_DATES'; เป็นเครื่องมือช่วยชีวิต ฉันมีปัญหานี้เมื่อฉันทำการโอนย้ายไซต์ wordpress ไปยังเซิร์ฟเวอร์อื่น (ทั้งในเครื่อง) และจะไม่ให้ฉันนำเข้าข้อมูลฐานข้อมูลเนื่องจากข้อผิดพลาดนี้แม้ว่าจะไม่มีแถวในตารางที่มีข้อผิดพลาดนี้
mikato

ทำงานเหมือนจับใจ! ขอบคุณ.
moreirapontocom

52

TIMESTAMP มีช่วงของ '1970-01-01 00:00:01' UTC ถึง '2038-01-19 03:14:07' UTC (ดูเอกสาร ) ค่าเริ่มต้นจะต้องอยู่ในช่วงนั้น

พฤติกรรมแปลก ๆ ที่เกี่ยวข้อง

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)

หมายเหตุด้านข้างหากคุณต้องการแทรก NULLS:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

1
สิ่งนี้เกิดขึ้นกับฉัน เกิดอะไรขึ้นเหรอ ts2 ไม่ได้เป็น "Not NULL" ... !
PedroD

2
อาจเป็นเพราะ "หากคุณไม่ได้ตั้งค่าสำหรับคอลัมน์ TIMESTAMP แรกในตาราง MariaDB จะกำหนดวันที่และเวลาปัจจุบันโดยอัตโนมัติเมื่อดำเนินการแบบสอบถาม UPDATE หรือ INSERT ในแถวที่สงสัย" - เอกสารของ MariaDB
jsphpl

1
column_name TIMESTAMP DEFAULT NOW()ผมชอบการใช้งานของ อาจไม่เหมาะสมสำหรับทุกสถานการณ์ แต่คิดว่าฉันจะแบ่งปันตั้งแต่ฉันจัดการเรื่องนี้ด้วย
DeezCashews

1
column_name TIMESTAMP DEFAULT '1970-01-01 00:00:01' ได้หลอกลวงให้ฉัน ขอบคุณ!
metafa

42

ใน Ubuntu บนเดสก์ท็อป 16.04 ฉันทำสิ่งนี้:

  1. open file: /etc/mysql/mysql.conf.d/mysqld.cnfในตัวแก้ไขที่คุณเลือก

  2. มองหา: มันจะเป็นที่ไหนสักแห่งภายใต้sql_mode[mysqld]

  3. และตั้งค่าsql_modeต่อไปนี้:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. บันทึกแล้วเริ่มบริการ mysql ใหม่โดยทำดังนี้

    sudo service mysql restart


8
มันช่วยได้ยกเว้นsql_modeว่าไม่ได้มีอินสแตนซ์ของ mySQL บน ubuntu16.04 ฉันต้องเพิ่มรายการในไฟล์โดยลบ "NO_ZERO_DATE" ออก ดังนั้นนี่คือวิธีการที่ดูเหมือนขณะนี้: #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
OK999

คุณถูกต้อง .. ฉันได้เพิ่มไว้ก่อนหน้านี้เพื่อปิดใช้งานโหมดเข้มงวด .. และเมื่อฉันแก้ไขมันสำหรับปัญหาเฉพาะนี้sql_modeรายการก็มีอยู่แล้ว
Mubashar Abbas

นี่เป็นข้อบกพร่องหรือไม่? CURRENT_TIMESTAMP ไม่ควรส่งคืน "0000-00-00 00:00:00" หรือฉันผิด ทำไมฉันต้องเปลี่ยนการตั้งค่า mysqld
letjump

@letsjump เนื่องจากมีคนกำหนดค่าเซิร์ฟเวอร์ mysql ของคุณไม่ถูกต้อง ฉันกำลังตีปัญหานี้ด้วยฐานข้อมูลที่ฉันนำเข้า ค่าเริ่มต้นสำหรับการประทับเวลาในคอลัมน์ไม่ใช่ค่าการประทับเวลาที่ถูกต้อง การแก้ไขที่แท้จริงคือการปรับปรุงการประทับเวลาเริ่มต้นเป็นสิ่งที่ถูกต้องเช่น 1970 - วันแรกสุดที่มีอยู่ วิธีแก้ปัญหาชั่วคราวคือปิดใช้งานการตรวจสอบบนฐานข้อมูล
anon58192932

9

ใช้OS X , ติดตั้ง mysql จากHomebrew , System Variables ตามค่าเริ่มต้นที่คอมไพล์แล้ว โซลูชันคือการลบ "NO_ZERO_DATE" ออกจากตัวแปรระบบ "sql_mode"

โปรดจำไว้ว่าขอบเขตนั้นเกี่ยวข้องกัน

หากคุณต้องการให้มีผลเฉพาะในเซสชันของคุณโปรดใช้"@@session"ตัวอย่างเช่น:

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

ในกรณีนี้จะไม่มีผลเมื่อเซสชันสิ้นสุดลงหรือเปลี่ยนแปลงได้ ไม่มีผลกับเซสชันอื่น

หากคุณต้องการมีผลกับลูกค้าทั้งหมดโปรดใช้"@@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".

ในกรณีนี้จะมีผลกับลูกค้าที่เชื่อมต่อหลังจากการเปลี่ยนแปลง (ไม่มีผลกับไคลเอนต์ทั้งหมดในปัจจุบัน) และจะไม่ทำงานเมื่อเซิร์ฟเวอร์ออก


8

ฉันสามารถแก้ไขปัญหานี้ใน OS X ได้โดยติดตั้ง MySQL จาก Homebrew

brew install mysql

โดยการเพิ่มสิ่งต่อไปนี้ใน /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

และเริ่ม MySQL ใหม่

brew tap homebrew/services
brew services restart mysql

7

ฉันมีปัญหาที่คล้ายกันกับ MySQL 5.7 ด้วยรหัสต่อไปนี้:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

ฉันแก้ไขโดยใช้สิ่งนี้แทน:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
ฉันคิดว่านี่เป็นตัวเลือกที่ดีที่สุดสำหรับเมื่อมันเหมาะสมที่จะเริ่มต้นถึงปัจจุบัน แต่มันจะไม่สมเหตุสมผลสำหรับการประทับเวลาเกิด - เช่นเดียวกับตัวอย่าง
meow

7

เพื่อหลีกเลี่ยงปัญหานี้คุณต้องลบออกNO_ZERO_DATEจากการกำหนดค่าโหมด mysql

  1. ไปที่ 'phpmyadmin'
  2. เมื่อโหลด phpmyadmin แล้วให้คลิกที่แท็บ 'ตัวแปร'
  3. ค้นหา 'sql mode'
  4. คลิกที่ตัวเลือกแก้ไขและลบNO_ZERO_DATE(และเครื่องหมายจุลภาคต่อท้าย) จากการกำหนดค่า

นี่เป็นปัญหาที่พบบ่อยมากในสภาพแวดล้อมท้องถิ่นที่มี wamp หรือ xamp


6

เพียงแค่กำหนดบรรทัดต่อไปนี้ที่ด้านบนของไฟล์ฐานข้อมูล SQL ของคุณ

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

มันใช้งานได้สำหรับฉัน


2

เพื่อปิดใช้งานโหมด SQL ที่เข้มงวด

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

ในไฟล์ให้ป้อนสองบรรทัดต่อไปนี้:

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

ในที่สุดรีสตาร์ท MySQL ด้วยคำสั่งนี้:

sudo service mysql restart

1

คุณอาจต้องการตรวจสอบการตั้งค่าเขตเวลาในอินสแตนซ์ MySql:

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

ในกรณีของฉันฉันตระหนักว่าระบบพื้นฐานมีการตั้งค่าเขตเวลาเป็น BST แทนที่จะเป็น UTC และในตารางสร้างค่าเริ่มต้นของ '1970-01-01 00:00:01' ถูกบังคับให้กลับมา 1 ชั่วโมง ค่าการประทับเวลาที่ไม่ถูกต้อง

สำหรับฉันฉันต้องการให้เขตเวลาของเครื่องตั้งค่าเป็น UTC และนั่นทำให้ฉันแยกออก ขณะที่ฉันใช้ Centos / 7 ฉันก็ทำได้

# timedatectl set-timezone UTC

และรีสตาร์ททุกสิ่ง


1

ค่าเริ่มต้นควรเริ่มต้นจากปี 1000

ตัวอย่างเช่น,

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

หวังว่านี่จะช่วยใครซักคน


1

เปลี่ยนสิ่งนี้:

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

ไปที่ต่อไปนี้:

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

1
จากการทบทวน: สวัสดีโปรดอย่าตอบเพียงแค่มีซอร์สโค้ด พยายามให้คำอธิบายที่ดีเกี่ยวกับวิธีการแก้ปัญหาของคุณ ดู: ฉันจะเขียนคำตอบที่ดีได้อย่างไร . ขอบคุณ
sɐunıɔןɐqɐp

หากนี่เป็นเว็บไซต์ WordPress โปรดอย่าอัพเดทตาราง Core WordPress ปลั๊กอินจำนวนมากคาดว่าจะมีค่าเป็น zeores ดังนั้น WordPress ไม่สามารถเปลี่ยนค่าเริ่มต้นนี้ได้ด้วยเหตุผลดั้งเดิมที่จะทำให้ปลั๊กอินแตก ด้าย Wordpressและสนับสนุน Wordpress การเปลี่ยนโครงสร้างฐานข้อมูลโดยไม่คุ้นเคยกับรหัสที่ใช้ค่าเริ่มต้นอาจทำให้เกิดข้อบกพร่องที่น่าเป็นห่วง ในขณะนี้อาจทำงานเป็นวิธีแก้ปัญหาในหลาย ๆ กรณีมันสามารถทำลาย havock ในผู้อื่น ไม่ใช่ทางออกสากล
SherylHohman

0

คุณสามารถเปลี่ยนสิ่งนี้:

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

เพื่อสิ่งนี้:

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

0

คุณสามารถเปลี่ยนสิ่งนี้:

create_date วันที่และเวลาไม่เป็นค่าเริ่มต้น '0000-00-00 00:00:00'

เพื่อสิ่งนี้:

create_date varchar (80) ไม่เป็นค่าเริ่มต้น '0000-00-00 00:00:00'

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