ERROR: Error 1067: Invalid default value for ON UPDATE CURRENT_TIMESTAMP

匿名 (未验证) 提交于 2019-12-03 01:14:02

问题:

I run the script from Workbench. Here is the complete script:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 

-- Schema mydb


DROP SCHEMA IF EXISTS `mydb` ; CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; USE `mydb` ; 

-- Table mydb.categories


DROP TABLE IF EXISTS `mydb`.`categories` ;  CREATE TABLE IF NOT EXISTS `mydb`.`categories` (   `categories_id` INT(5) UNSIGNED NOT NULL,   `categories_name` VARCHAR(32) NOT NULL,   `categories_image` VARCHAR(64) NULL,   `parent_id` INT(5) UNSIGNED NOT NULL,   `sort_order` INT(3) NULL,   `date_added` TIMESTAMP NOT NULL DEFAULT 0,   `last_modified` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,   PRIMARY KEY (`categories_id`),   INDEX `fk_categories_categories1_idx` (`parent_id` ASC),   CONSTRAINT `fk_categories_categories1`     FOREIGN KEY (`parent_id`)     REFERENCES `mydb`.`categories` (`categories_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION) ENGINE = InnoDB; 

-- Table mydb.manufacturers


DROP TABLE IF EXISTS `mydb`.`manufacturers` ;  CREATE TABLE IF NOT EXISTS `mydb`.`manufacturers` (   `manufacturers_id` INT(5) UNSIGNED NOT NULL,   `manufacturers_name` VARCHAR(32) NOT NULL,   `date_added` TIMESTAMP NOT NULL DEFAULT 0,   PRIMARY KEY (`manufacturers_id`)) ENGINE = InnoDB; 

-- Table mydb.products


DROP TABLE IF EXISTS `mydb`.`products` ;  CREATE TABLE IF NOT EXISTS `mydb`.`products` (   `products_id` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,   `products_model` VARCHAR(20) NULL,   `products_price` DECIMAL(10,2) UNSIGNED NULL,   `products_weight` DECIMAL(4,2) UNSIGNED NULL,   `manufacturers_id` INT(5) UNSIGNED NOT NULL,   PRIMARY KEY (`products_id`),   INDEX `fk_products_manufacturers1_idx` (`manufacturers_id` ASC),   CONSTRAINT `manufacturers_id`     FOREIGN KEY (`manufacturers_id`)     REFERENCES `mydb`.`manufacturers` (`manufacturers_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION) ENGINE = InnoDB; 

-- Table mydb.categories_has_products


DROP TABLE IF EXISTS `mydb`.`categories_has_products` ;  CREATE TABLE IF NOT EXISTS `mydb`.`categories_has_products` (   `categories_id` INT(5) UNSIGNED NOT NULL,   `products_id` INT(5) UNSIGNED NOT NULL,   PRIMARY KEY (`categories_id`, `products_id`),   INDEX `fk_categories_has_products_products_idx` (`products_id` ASC),   INDEX `fk_categories_has_products_categories_idx` (`categories_id` ASC),   CONSTRAINT `categories_id`     FOREIGN KEY (`categories_id`)     REFERENCES `mydb`.`categories` (`categories_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION,   CONSTRAINT `products_id`     FOREIGN KEY (`products_id`)     REFERENCES `mydb`.`products` (`products_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION) ENGINE = InnoDB; 

-- Table mydb.products_description


DROP TABLE IF EXISTS `mydb`.`products_description` ;  CREATE TABLE IF NOT EXISTS `mydb`.`products_description` (   `products_id` INT(5) UNSIGNED NOT NULL,   `products_name` VARCHAR(64) NOT NULL,   `products_description` TEXT NULL,   `products_url` VARCHAR(255) NULL,   `products_viewed` INT(5) UNSIGNED NULL,   PRIMARY KEY (`products_id`),   UNIQUE INDEX `products_name_UNIQUE` (`products_name` ASC),   CONSTRAINT `products_id`     FOREIGN KEY (`products_id`)     REFERENCES `mydb`.`products` (`products_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION) ENGINE = InnoDB; 

-- Table mydb.customers


DROP TABLE IF EXISTS `mydb`.`customers` ;  CREATE TABLE IF NOT EXISTS `mydb`.`customers` (   `customers_id` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,   `customers_gender` CHAR(1) NULL,   `customers_firstname` VARCHAR(32) NOT NULL,   `customers_lastname` VARCHAR(32) NULL,   `customers_dob` DATE NULL,   `customers_email_address` VARCHAR(96) NULL,   `customers_default_address_id` INT(5) UNSIGNED NULL,   `customers_telephone` VARCHAR(32) NULL,   `customers_fax` VARCHAR(32) NULL,   `customers_password` VARCHAR(40) NULL,   `customers_newsletter` CHAR(1) NULL,   `customers_info_date_of_last_logon` DATETIME NOT NULL,   `customers_info_number_of_logons` INT(5) UNSIGNED NOT NULL,   `customers_info_date_account_created` TIMESTAMP NOT NULL DEFAULT 0,   `customers_info_date_account_last_modified` TIMESTAMP NOT NULL,   PRIMARY KEY (`customers_id`)) ENGINE = InnoDB; 

-- Table mydb.reviews


DROP TABLE IF EXISTS `mydb`.`reviews` ;  CREATE TABLE IF NOT EXISTS `mydb`.`reviews` (   `reviews_id` INT(5) UNSIGNED NOT NULL,   `products_id` INT(5) UNSIGNED NOT NULL,   `customers_id` INT(5) UNSIGNED NOT NULL,   `customers_name` VARCHAR(64) NULL,   `reviews_rating` INT(1) UNSIGNED NULL,   `date_added` TIMESTAMP NOT NULL DEFAULT 0,   `last_modified` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,   `reviews_read` INT(5) UNSIGNED NULL,   `reviews_text` TEXT NULL,   PRIMARY KEY (`reviews_id`),   INDEX `fk_reviews_products1_idx` (`products_id` ASC),   INDEX `fk_reviews_customers1_idx` (`customers_id` ASC),   CONSTRAINT `fk_reviews_products1`     FOREIGN KEY (`products_id`)     REFERENCES `mydb`.`products` (`products_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION,   CONSTRAINT `fk_reviews_customers1`     FOREIGN KEY (`customers_id`)     REFERENCES `mydb`.`customers` (`customers_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION) ENGINE = InnoDB; 

-- Table mydb.specials


DROP TABLE IF EXISTS `mydb`.`specials` ;  CREATE TABLE IF NOT EXISTS `mydb`.`specials` (   `specials_id` INT(5) UNSIGNED NOT NULL,   `products_id` INT(5) UNSIGNED NOT NULL,   `specials_new_products_price` DECIMAL(10,2) UNSIGNED NULL,   `specials_date_added` TIMESTAMP NOT NULL DEFAULT 0,   `specials_last_modified` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,   PRIMARY KEY (`specials_id`),   INDEX `fk_specials_products1_idx` (`products_id` ASC),   CONSTRAINT `fk_specials_products1`     FOREIGN KEY (`products_id`)     REFERENCES `mydb`.`products` (`products_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION) ENGINE = InnoDB; 

-- Table mydb.orders


DROP TABLE IF EXISTS `mydb`.`orders` ;  CREATE TABLE IF NOT EXISTS `mydb`.`orders` (   `orders_id` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,   `customers_id` INT(5) UNSIGNED NOT NULL,   `customers_street_address` VARCHAR(64) NOT NULL,   `customers_suburb` VARCHAR(32) NULL,   `customers_city` VARCHAR(32) NOT NULL,   `customers_postcode` VARCHAR(10) NULL,   `customers_state` VARCHAR(32) NULL,   `customers_country` VARCHAR(32) NULL,   `customers_telephone` VARCHAR(32) NULL,   `customers_email_address` VARCHAR(96) NULL,   `delivery_name` VARCHAR(64) NULL,   `delivery_street_address` VARCHAR(64) NULL,   `delivery_suburb` VARCHAR(32) NULL,   `delivery_city` VARCHAR(32) NULL,   `delivery_postcode` VARCHAR(10) NULL,   `delivery_state` VARCHAR(32) NULL,   `delivery_country` VARCHAR(32) NULL,   `payment_method` VARCHAR(12) NULL,   `cc_type` VARCHAR(20) NULL,   `cc_owner` VARCHAR(64) NULL,   `cc_number` VARCHAR(32) NULL,   `cc_expires` VARCHAR(4) NULL,   `last_modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,   `date_purchased` TIMESTAMP NOT NULL DEFAULT 0,   `shipping_cost` DECIMAL(10,2) UNSIGNED NULL,   `shipping_method` VARCHAR(32) NULL,   `orders_status` VARCHAR(10) NULL,   `orders_date_finished` DATETIME NULL,   `comments` TEXT NULL,   `currency` VARCHAR(3) NULL,   `currency_value` DECIMAL(16,6) NULL,   PRIMARY KEY (`orders_id`),   INDEX `fk_orders_customers1_idx` (`customers_id` ASC),   CONSTRAINT `fk_orders_customers1`     FOREIGN KEY (`customers_id`)     REFERENCES `mydb`.`customers` (`customers_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION) ENGINE = InnoDB; 

-- Table mydb.ordered_products


DROP TABLE IF EXISTS `mydb`.`ordered_products` ;  CREATE TABLE IF NOT EXISTS `mydb`.`ordered_products` (   `orders_id` INT(5) UNSIGNED NOT NULL,   `products_id` INT(5) UNSIGNED NOT NULL,   `products_size_id` TINYINT UNSIGNED NOT NULL,   `products_color_id` TINYINT UNSIGNED NOT NULL,   `products_price` DECIMAL(10,2) UNSIGNED NOT NULL,   `quantity` TINYINT UNSIGNED NOT NULL,   PRIMARY KEY (`orders_id`, `products_id`, `products_size_id`, `products_color_id`),   INDEX `fk_orders_has_products_products1_idx` (`products_id` ASC),   INDEX `fk_orders_has_products_orders1_idx` (`orders_id` ASC),   CONSTRAINT `fk_orders_has_products_orders1`     FOREIGN KEY (`orders_id`)     REFERENCES `mydb`.`orders` (`orders_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION,   CONSTRAINT `fk_orders_has_products_products1`     FOREIGN KEY (`products_id`)     REFERENCES `mydb`.`products` (`products_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION) ENGINE = InnoDB; 

-- Table mydb.ordered_products


DROP TABLE IF EXISTS `mydb`.`ordered_products` ;  CREATE TABLE IF NOT EXISTS `mydb`.`ordered_products` (   `orders_id` INT(5) UNSIGNED NOT NULL,   `products_id` INT(5) UNSIGNED NOT NULL,   `products_size_id` TINYINT UNSIGNED NOT NULL,   `products_color_id` TINYINT UNSIGNED NOT NULL,   `products_price` DECIMAL(10,2) UNSIGNED NOT NULL,   `quantity` TINYINT UNSIGNED NOT NULL,   PRIMARY KEY (`orders_id`, `products_id`, `products_size_id`, `products_color_id`),   INDEX `fk_orders_has_products_products1_idx` (`products_id` ASC),   INDEX `fk_orders_has_products_orders1_idx` (`orders_id` ASC),   CONSTRAINT `fk_orders_has_products_orders1`     FOREIGN KEY (`orders_id`)     REFERENCES `mydb`.`orders` (`orders_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION,   CONSTRAINT `fk_orders_has_products_products1`     FOREIGN KEY (`products_id`)     REFERENCES `mydb`.`products` (`products_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION) ENGINE = InnoDB; 

-- Table mydb.products_size


DROP TABLE IF EXISTS `mydb`.`products_size` ;  CREATE TABLE IF NOT EXISTS `mydb`.`products_size` (   `products_size_id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,   `products_size_name` VARCHAR(15) NOT NULL,   PRIMARY KEY (`products_size_id`)) ENGINE = InnoDB; 

-- Table mydb.products_color


DROP TABLE IF EXISTS `mydb`.`products_color` ;  CREATE TABLE IF NOT EXISTS `mydb`.`products_color` (   `products_color_id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,   `products_color_name` VARCHAR(20) NOT NULL,   PRIMARY KEY (`products_color_id`)) ENGINE = InnoDB; 

-- Table mydb.products_attributes


DROP TABLE IF EXISTS `mydb`.`products_attributes` ;  CREATE TABLE IF NOT EXISTS `mydb`.`products_attributes` (   `products_id` INT(5) UNSIGNED NOT NULL,   `products_size_id` TINYINT UNSIGNED NOT NULL,   `products_color_id` TINYINT UNSIGNED NOT NULL,   `products_quantity` INT(4) UNSIGNED NOT NULL,   `products_image` VARCHAR(64) NULL,   `products_date_added` TIMESTAMP NOT NULL DEFAULT 0,   `products_last_modified` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,   `products_date_available` DATETIME NULL,   `products_status` TINYINT UNSIGNED NULL,   PRIMARY KEY (`products_id`, `products_size_id`, `products_color_id`),   INDEX `fk_products_attributes_products_sizes1_idx` (`products_size_id` ASC),   INDEX `fk_products_attributes_products_colors1_idx` (`products_color_id` ASC),   CONSTRAINT `fk_products_attributes_products1`     FOREIGN KEY (`products_id`)     REFERENCES `mydb`.`products` (`products_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION,   CONSTRAINT `fk_products_attributes_products_sizes1`     FOREIGN KEY (`products_size_id`)     REFERENCES `mydb`.`products_size` (`products_size_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION,   CONSTRAINT `fk_products_attributes_products_colors1`     FOREIGN KEY (`products_color_id`)     REFERENCES `mydb`.`products_color` (`products_color_id`)     ON DELETE NO ACTION     ON UPDATE NO ACTION) ENGINE = InnoDB;   SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; 

And here is the complete error:

Executing SQL script in server

ERROR: Error 1067: Invalid default value for 'last_modified' SQL Code:         CREATE TABLE IF NOT EXISTS `mydb`.`categories` (           `categories_id` INT(5) UNSIGNED NOT NULL,           `categories_name` VARCHAR(32) NOT NULL,           `categories_image` VARCHAR(64) NULL,           `parent_id` INT(5) UNSIGNED NOT NULL,           `sort_order` INT(3) NULL,           `date_added` TIMESTAMP NOT NULL DEFAULT 0,           `last_modified` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,           PRIMARY KEY (`categories_id`),           INDEX `fk_categories_categories1_idx` (`parent_id` ASC),           CONSTRAINT `fk_categories_categories1`             FOREIGN KEY (`parent_id`)             REFERENCES `mydb`.`categories` (`categories_id`)             ON DELETE NO ACTION             ON UPDATE NO ACTION)         ENGINE = InnoDB  SQL script execution finished: statements: 7 succeeded, 1 failed 

Fetching back view definitions in final form. Nothing to fetch

回答1:

It is because of the SQL_MODE you are setting.

TRADITIONAL and ALLOW_INVALID_DATES restricts the TIMESTAMP type columns for not being set with a default value.

By defining any of the following should work on TIMESTAMP type columns.

DEFAULT 0 DEFAULT CURRENT_TIMESTAMP 

Alternately, by just setting the SQL_MODE to ALLOW_INVALID_DATES would need no changes to your script.


Others:
Constraint names MUST be unique. Table products_description defines Constraint products_id but the same name was already used in table categories_has_products.

Maintain unique constraint names.

Refer to:



回答2:

Change the SQL_MODE like below:

SET GLOBAL sql_mode = 'ALLOW_INVALID_DATES’; SET SESSION sql_mode = 'ALLOW_INVALID_DATES'; 


回答3:

Since last_modified cannot be null by your definition, you have to provide a default value as well:

`last_modified` TIMESTAMP NOT NULL DEFAULT NOW() ON UPDATE NOW() 


回答4:

I had the same problem and too many dates to change. I set this at the top of my .sql script and all was well.

SET sql_mode = 'ALLOW_INVALID_DATES'; 


回答5:

I`m not sure if its correct but I set on "my sql settings -> sql-mode as none or something like this (the other beyond "sql-mode -> user-mode") solved my problem



回答6:

So in my case ubuntu 16.04 instance with lemp i had to change the mysql time stamp so log into mysql and execute below commands

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!