LỖI 1067 (42000): Giá trị mặc định không hợp lệ cho 'create_at'


102

Khi tôi cố gắng thay đổi bảng, nó hiển thị lỗi:

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

Tôi đã tìm kiếm lỗi này trên Google nhưng tất cả những gì tôi tìm thấy là như thể họ cố gắng thay đổi dấu thời gian để nó xảy ra. Tuy nhiên, ở đây tôi đang cố gắng thêm một cột mới và gặp lỗi này:

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

và hai cột cuối cùng trong bảng của tôi là created_atupdated_at.

Đây là cấu trúc bảng của tôi:

nhập mô tả hình ảnh ở đây


các giá trị mặc định cho các cột này là gì? Bạn có thể vui lòng chia sẻ cấu trúc bảng?
Priyanshu

@Priyanshu Tôi đã cập nhật cấu trúc bảng của mình
iamsujit

2
đặt giá trị mặc định current_timestamp cho hai cột cuối cùng.
Priyanshu

Câu trả lời:


145

Vấn đề là do sql_modes . Vui lòng kiểm tra sql_modes hiện tại của bạn bằng lệnh:

show variables like 'sql_mode' ; 

Và xóa sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE " để làm cho nó hoạt động. Đây là sql_mode mặc định trong các phiên bản mới của mysql.

Bạn có thể đặt sql_mode trên toàn cầu làm root bằng lệnh:

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

7
Tôi biết điều này, nhưng sql_mode trên máy chủ của tôi hiển thị trống, Vẫn không hoạt động, tôi đang sử dụng [Phiên bản máy chủ: 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)]. Bất kỳ ai có thể có bất kỳ giải pháp nào mà không cần nâng cấp phiên bản máy chủ?
Priyabrata Atha

bạn đã kiểm tra bằng lệnh toàn cầu chưa? và không có gì trong sql_mode cho cùng một phiên?
Aman Aggarwal

Tôi đã kiểm tra các biến hiển thị như 'sql_mode'; và đầu ra là Variable_name | Value = sql_mode |
Priyabrata Atha

2
Điều này sẽ có ích cho câu trả lời này stackoverflow.com/questions/2317650/...
Preshan Pradeepa

4
Không phù hợp với tôi với 5,7. Không chắc liệu tôi có phải làm điều đó trên toàn cầu hay không.
Brett

97

Đơn giản, trước khi bạn chạy bất kỳ câu lệnh nào, hãy đặt câu lệnh này ở dòng đầu tiên:

SET sql_mode = '';

điều đó thật tuyệt vời. Cảm ơn anh bạn!
Novasol

7
Cảm ơn vì tiền hỗ trợ. Nhưng chỉ loại bỏ các giới hạn về ngày NO_ZERO_IN_DATE,NO_ZERO_DATEchỉ cho phép chúng tôi duy trì các tính năng bảo mật khác:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
KeitelDOG 16/01 '19

1
Để làm rõ, tuyên bố này chỉ nên được sử dụng trong phát triển, không sử dụng trong sản xuất.
Ahmed Mohamed

Đơn giản và đi thẳng vào vấn đề.
Frank Fotangs

28

Tôi đã gặp phải lỗi tương tự khi cố gắng cài đặt cơ sở dữ liệu của bên thứ ba. Tôi đã thử giải pháp được đề xuất không thành công tức là
SET sql_mode = '';

Sau đó, tôi đã thử lệnh dưới đây hoạt động cho phép cơ sở dữ liệu được cài đặt
SET GLOBAL sql_mode = '';


1
SET sql_mode = '';hiện không được dùng nữa, SET GLOBAL sql_mode = ''vẫn ổn
Vadim Anisimov

26

Hãy thử và chạy lệnh sau:

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

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

Lý do bạn nhận được lỗi này là vì bạn không đặt giá trị mặc định cho các trường created_atupdated_at. MySQL không chấp nhận lệnh của bạn vì giá trị cho các cột này không được rỗng.

Hi vọng điêu nay co ich.


2
Cảm ơn, bỏ phiếu tán, tôi thích giải pháp này trong trường hợp sử dụng của tôi
ChrisR

5

Trong trường hợp của tôi, tôi có một tệp cần nhập. Vì vậy, tôi chỉ cần thêm SET sql_mode = ''; ở đầu tệp và nó hoạt động!


5

Chạy truy vấn này:

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

nó làm việc cho tôi


nhân tiện không cần SET time_zone = "+00: 00";
Safak Ciplak

3

Bạn có thể làm như thế này:

 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;
  • Vì giá trị TIMESTAMP được lưu trữ dưới dạng Kỷ nguyên Giây nên giá trị dấu thời gian '1970-01-01 00:00:00' (UTC) được bảo lưu vì số 0 thứ hai được sử dụng để đại diện cho '0000-00-00 00:00:00 '.
  • Trong MariaDB 5.5 trở về trước, chỉ có thể có một cột TIMESTAMP trên mỗi bảng có CURRENT_TIMESTAMP được xác định làm giá trị mặc định của nó. Giới hạn này đã không còn được áp dụng kể từ MariaDB 10.0.

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

mẫu vật

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

Tôi đã có vấn đề tương tự. Sau đây đã giải quyết nó:

Thay đổi:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

đến:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

tức là chỉ cần xóa các dấu ngoặc kép xung quanh CURRENT_TIMESTAMP .

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


3

Như đã đề cập trong câu trả lời của @Bernd Buffen. Đây là vấn đề với MariaDB 5.5, tôi đơn giản nâng cấp MariaDB 5.5 lên MariaDB 10.1 và vấn đề đã được giải quyết.

Tại đây Các bước nâng cấp MariaDB 5.5 thành MariaDB 10.1 tại CentOS 7 (64-Bit)

  1. Thêm các dòng sau vào kho MariaDB.

    nano /etc/yum.repos.d/mariadb.repo và dán các dòng sau.

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

  1. Dừng MariaDB, nếu đã chạy service mariadb stop
  2. Thực hiện cập nhật

    yum update

  3. Bắt đầu MariaDB và thực hiện nâng cấp

    service mariadb start

    mysql_upgrade

Mọi thứ đã xong.

Kiểm tra phiên bản MariaDB: mysql -V


LƯU Ý : Hãy luôn sao lưu (các) Cơ sở dữ liệu trước khi thực hiện nâng cấp. Dữ liệu có thể bị mất nếu nâng cấp không thành công hoặc xảy ra sự cố.


3
SET GLOBAL sql_mode = '';

Đã giải quyết vấn đề của tôi.



2

Đối với Mysql5.7, đăng nhập vào dòng lệnh mysql và chạy lệnh,

mysql> show variables like 'sql_mode' ;

Nó sẽ hiển thị rằng NO_ZERO_IN_DATE, NO_ZERO_DATE trong sql_mode.

nhập mô tả hình ảnh ở đây

Cố gắng thêm một dòng bên dưới [mysqld] trong tệp conf mysql của bạn để xóa hai tùy chọn, của tôi (mysql 5.7 trên Ubuntu 16) là /etc/mysql/mysql.conf.d/mysqld.cnf

nhập mô tả hình ảnh ở đây

Bây giờ khởi động lại mysql. Nó hoạt động!


0

Đối với Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

Xóa "([fsp])", đã giải quyết được sự cố của tôi.


0
  1. Trước tiên, hãy kiểm tra (các) chế độ hiện có đang sử dụng lệnh sau trong thiết bị đầu cuối của bạn:

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

    hoặc là

    mysql> show variables like 'sql_mode';

    Bạn sẽ thấy một kết quả như bên dưới

    nhập mô tả hình ảnh ở đây

  2. Tắt (các) chế độ qua my.cnf: Trong trường hợp này, bạn cần xóa chế độ NO_ZERO_IN_DATE, NO_ZERO_DATE

    Mở tệp my.cnf (Nói chung, bạn có thể tìm thấy tệp my.cnf nằm trong /etc/my.cnf hoặc /etc/mysql/my.cnf)

    Cập nhật các chế độ trong my.cnf dưới [mysqld]tiêu đề

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    Ở đây tôi đã bỏ qua các chế độ NO_ZERO_IN_DATE, NO_ZERO_DATE

  3. Khởi động lại máy chủ mysql

    $ /etc/init.d/mysql restart

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.