Giá trị mặc định không hợp lệ cho trường dấu thời gian 'create_date'


186

Tôi có tuyên bố tạo sql sau đây

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 ra lỗi sau

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

Lỗi ở đây là gì?


Tôi không thể thấy bất cứ điều gì sai với truy vấn của bạn và nó hoạt động trên 5.1.50 - cộng đồng vừa được thử nghiệm.
Jaspreet Chahal

Các truy vấn là cuối cùng của tôi là quá.
Shakti Singh

Không chắc chắn nhưng đặt một tên khác cho lĩnh vực đó và thử?
Naveen Kumar

tôi sử dụng cộng đồng mysql 5.1.56 trong Ubuntu 10.04. và không hoạt động
robert

5
Ngày không có yêu cầu một ngày. Sử dụng '1970-01-01 00:00:01'. [lấy từ đây] [1] [1]: dba.stackexchange.com/questions/6171/ Kẻ
Jadeye

Câu trả lời:


175

Đó là do Chế độ SQL của máy chủ - NO_ZERO_DATE .

Từ tham chiếu: NO_ZERO_DATE- Trong chế độ nghiêm ngặt, không cho phép '0000-00-00'là ngày hợp lệ. Bạn vẫn có thể chèn ngày không với tùy chọn IGNORE . Khi không ở chế độ nghiêm ngặt, ngày được chấp nhận nhưng cảnh báo được tạo.


18
Làm thế nào để tôi bỏ qua tùy chọn?
robert

9
Bạn không thể bỏ qua tùy chọn này. Đây là tùy chọn máy chủ. Nếu bạn có quyền truy cập vào my.ini (tệp cấu hình mysql), sau đó xóa NO_ZERO_DATE khỏi tùy chọn chế độ sql và khởi động lại máy chủ.
Devart

7
Để kiểm tra tùy chọn này - hãy chạy SHOW VARIABLES THÍCH 'sql_mode'
Devart

6
tôi đã tạo tập lệnh bằng cách sử dụng bàn làm việc mysql. Trong kịch bản, sql_mode được đặt thành truyền thống. Nếu tôi loại bỏ truyền thống, kịch bản hoạt động.
robert

17
Trong tùy chọn MySQL Workbench, chuyển đến tab 'Model: MySQL'. Ở đó đã đặt 'SQL_MODE được sử dụng trong các tập lệnh được tạo' thành "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITNING" Điều đó giải quyết vấn đề tốt.
sgtdck

140

Nếu bạn đã tạo tập lệnh từ bàn làm việc của MySQL.

Dòng sau được tạo

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

Xóa TRUYỀN THỐNG khỏi SQL_MODE và sau đó tập lệnh sẽ hoạt động tốt

Khác, bạn có thể đặt SQL_MODE là Cho phép Ngày không hợp lệ

SET SQL_MODE='ALLOW_INVALID_DATES';

1
Tiết kiệm cho tôi một chút thời gian tìm kiếm tại sao nó không hoạt động :)
Srneczek

5
Ahhh cảm ơn bạn. THIẾT LẬP SQL_MODE = 'ALLOW_INVALID_DATE'; là một vị cứu tinh Tôi gặp vấn đề này khi tôi di chuyển một trang wordpress sang một máy chủ khác (cả cục bộ) và nó sẽ không cho phép tôi nhập dữ liệu cơ sở dữ liệu do lỗi này, mặc dù không có hàng nào trong các bảng có lỗi này.
mikato

Làm việc như người ở! Cảm ơn bạn.
moreirapontocom

52

TIMESTAMP có phạm vi '1970-01-01 00:00:01' UTC đến '2038-01-19 03:14:07' UTC (xem tài liệu ). Giá trị mặc định phải nằm trong phạm vi đó.

Hành vi kỳ quặc, liên quan, khác:

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)

Lưu ý bên, nếu bạn muốn chèn NULLS:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

1
Điều này đang xảy ra với tôi. Chuyện gì đang xảy ra? ts2 thậm chí còn không "KHÔNG NULL" ...!
Pedro

2
Có thể là do "Nếu bạn không đặt giá trị cho cột TIMESTAMP đầu tiên trong bảng, MariaDB sẽ tự động gán cho nó ngày và giờ hiện tại khi thực hiện truy vấn CẬP NHẬT hoặc INSERT trên (các) hàng trong câu hỏi." - Tài liệu MariaDB
jsphpl

1
Tôi thích việc sử dụng column_name TIMESTAMP DEFAULT NOW(). Có thể không phù hợp với mọi tình huống nhưng tôi nghĩ tôi sẽ chia sẻ vì tôi cũng đang giải quyết vấn đề này.
DeezCashews

1
cột_name TIMESTAMP DEFAULT '1970-01-01 00:00:01' đã lừa tôi. Cảm ơn!
metaha

41

Trong máy tính để bàn Ubuntu 16.04, tôi đã làm điều này:

  1. mở tập tin: /etc/mysql/mysql.conf.d/mysqld.cnftrong một trình soạn thảo của sự lựa chọn của bạn.

  2. Hãy tìm : sql_mode, nó sẽ ở đâu đó bên dưới [mysqld].

  3. và đặt thành sql_modenhư sau:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. Lưu và sau đó khởi động lại dịch vụ mysql bằng cách thực hiện:

    sudo service mysql restart


8
Nó đã giúp, ngoại trừ việc tôi sql_modekhông có phiên bản myQuery của tôi trên ubfox16.04. Tôi đã phải thêm một mục nhập cho nó trong tệp, bằng cách xóa "NO_ZERO_DATE". Vì vậy, đây là cách có vẻ bây giờ: #adding dưới đây dòng để thoát khỏi 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

bạn đã đúng .. Tôi đã thêm rằng trước đó để vô hiệu hóa chế độ nghiêm ngặt .. và khi tôi chỉnh sửa nó cho vấn đề cụ thể này, sql_modemục nhập đã ở đó.
Mubashar Abbas

Đây có phải là một lỗi? CURRENT_TIMESTAMP không bao giờ nên trả lại "0000-00-00 00:00:00", hay tôi sai? Tại sao tôi phải thay đổi cài đặt mysqld?
letjump

@letsjump vì ai đó đã cấu hình máy chủ mysql của bạn không chính xác. Tôi đang gặp vấn đề này với cơ sở dữ liệu tôi đã nhập. giá trị mặc định cho dấu thời gian trong cột không phải là giá trị dấu thời gian hợp lệ. Cách khắc phục THỰC SỰ là cập nhật dấu thời gian mặc định thành thứ gì đó hợp lệ như năm 1970 - ngày sớm nhất có sẵn. Cách giải quyết tạm thời là vô hiệu hóa kiểm tra trên cơ sở dữ liệu.
anon58192932

9

Sử dụng OS X , cài đặt mysql từ Homebrew , Biến hệ thống dựa trên các giá trị mặc định được biên dịch. Giải pháp là xóa "NO_ZERO_DATE" khỏi Biến hệ thống "sql_mode".

Chỉ cần lưu ý rằng phạm vi liên quan.

Nếu bạn chỉ muốn ảnh hưởng đến phiên của mình, vui lòng sử dụng "@@session", Ví dụ:

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

Trong trường hợp này, nó sẽ không ảnh hưởng khi phiên của bạn kết thúc hoặc thay đổi nó. Nó không có hiệu lực trên phiên khác.

Nếu bạn muốn ảnh hưởng đến tất cả khách hàng, vui lòng sử dụng "@@global", ví dụ:

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

Trong trường hợp này, nó chỉ ảnh hưởng đến các máy khách kết nối sau khi thay đổi (không ảnh hưởng đến tất cả các máy khách hiện tại) và sẽ không hoạt động khi máy chủ thoát.


8

Tôi đã có thể giải quyết vấn đề này trên OS X bằng cách cài đặt MySQL từ Homebrew

brew install mysql

bằng cách thêm dòng sau vào /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

và khởi động lại MySQL

brew tap homebrew/services
brew services restart mysql

7

Tôi gặp vấn đề tương tự với MySQL 5.7 với đoạn mã sau:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Tôi đã sửa bằng cách sử dụng cái này thay thế:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
Tôi nghĩ rằng đây thực sự là lựa chọn tốt nhất khi nó có ý nghĩa mặc định với hiện tại, tuy nhiên nó sẽ không có ý nghĩa đối với dấu thời gian sinh - chỉ là một ví dụ.
meo

7

Để tránh vấn đề này, bạn cần xóa NO_ZERO_DATEkhỏi cấu hình chế độ mysql.

  1. Chuyển đến 'phpmyadmin'.
  2. Khi phpmyadmin được tải lên, hãy nhấp vào tab 'biến'.
  3. Tìm kiếm mode chế độ sql '.
  4. Nhấp vào tùy chọn Chỉnh sửa và xóa NO_ZERO_DATE(và dấu phẩy của nó) khỏi cấu hình.

Đây là một vấn đề rất phổ biến trong môi trường địa phương với wamp hoặc xamp.


6

Chỉ cần xác định các dòng sau ở đầu tệp SQL cơ sở dữ liệu của bạn.

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

Đó là làm việc cho tôi.


2

Để tắt chế độ SQL nghiêm ngặt

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

Trong tệp, nhập hai dòng sau:

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

Cuối cùng, khởi động lại MySQL bằng lệnh này:

sudo service mysql restart

1

Bạn có thể muốn kiểm tra cài đặt múi giờ trên phiên bản MySql:

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

trong trường hợp của tôi, tôi nhận ra rằng hệ thống cơ bản có múi giờ được đặt thành BST thay vì UTC, và do đó, trong bảng tạo, mặc định '1970-01-01 00:00:01' đã bị ép lại 1 giờ, dẫn đến một giá trị dấu thời gian không hợp lệ.

Đối với tôi, tôi thực sự muốn múi giờ của máy được đặt thành UTC và điều đó đã sắp xếp tôi ra. Khi tôi đang chạy Centos / 7, tôi chỉ đơn giản là làm

# timedatectl set-timezone UTC

và khởi động lại mọi thứ.


1

Giá trị mặc định sẽ bắt đầu từ năm 1000.

Ví dụ,

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

Hy vọng điều này sẽ giúp được ai đó.


1

Thay đổi điều này:

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

Theo sau:

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

1
Từ đánh giá: Xin chào, xin vui lòng không trả lời chỉ với mã nguồn. Cố gắng cung cấp một mô tả hay về cách giải pháp của bạn hoạt động. Xem: Làm thế nào để tôi viết một câu trả lời tốt? . Cảm ơn
sunıɔ qɐp

Nếu đây là một trang web WordPress, vui lòng không cập nhật các bảng Core WordPress. Nhiều plugin mong đợi một giá trị của zeores, vì vậy WordPress không thể thay đổi giá trị mặc định này vì lý do di sản sẽ phá vỡ các plugin. Chủ đề Wordpresshỗ trợ Wordpress . Thay đổi cấu trúc cơ sở dữ liệu mà không có sự quen thuộc của mã dựa trên các giá trị mặc định có thể dẫn đến các lỗi đáng lo ngại. Trong khi điều này có thể hoạt động như một giải pháp trong nhiều trường hợp, nó có thể phá hỏng sự tàn phá ở những người khác. Không phải là một giải pháp phổ quát.
SherylHohman

0

Bạn chỉ có thể thay đổi điều này:

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

Để một cái gì đó như thế này:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.