在MySQL中创建表时出错

时间:2016-03-12 20:06:40

标签: php mysql sql database

CREATE DATABASE vehicle_system;

USE vehicle_system;

USE vehicle_system; CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) DEFAULT NULL,
  `email` varchar(255) NOT NULL, 
  `password_hash` text NOT NULL, 
  `api_key` varchar(32) NOT NULL, 
  `phone` varchar(14) NOT NULL, 
  `status` int(1) NOT NULL DEFAULT '1', 
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
  `updated_at` timestamp NOT NULL, 
  PRIMARY KEY (`id`), 
  UNIQUE KEY `email` (`email`), 
  UNIQUE KEY `phone` (`phone`)
);

CREATE TABLE IF NOT EXISTS `vehicle_model` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) DEFAULT NULL,
  `manufacturer_id` int(11) NOT NULL,
  `manufacturer_name` varchar(250) NOT NULL,
  `model` varchar(32) NOT NULL,
  `model_no` varchar(32) NOT NULL,
  `type` varchar(32) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `manufacturer_id` (`manufacturer_id`)
);

CREATE TABLE IF NOT EXISTS `user_vehicles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  `manufacturer_id` int(11) NOT NULL,
  `vehicle_no` varchar(32) NOT NULL,
  `rc_no` text,
  `engine_type` varchar(32),
  `year` int(4),
  `insurance_exp_date` timestamp,
  `pollution_exp_date` timestamp,
  `rc_renew_date` timestamp,
  `insurance_company` varchar(32),
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `vehicle_no` (`vehicle_no`),
  KEY `user_id` (`user_id`),
  KEY `manufacturer_id` (`manufacturer_id`)
);

执行上述查询时,我得到了

  

#1293 - 表定义不正确;在DEFAULT或ON UPDATE子句中只能有一个TIMESTAMP列和CURRENT_TIMESTAMP

但我没有在查询中看到两个默认时间戳,任何人都可以指出可能的错误。是因为users表中存在当前时间戳吗?如果是这样如何摆脱这个?

1 个答案:

答案 0 :(得分:0)

我认为问题是你没有所有timestamp类型字段的默认值。

运行查询我收到以下错误:

Error Code: 1067. Invalid default value for 'updated_at'

然后我得到了:

Error Code: 1067. Invalid default value for 'pollution_exp_date'

当所有时间戳字段都有默认值时,一切正常:

CREATE DATABASE vehicle_system;

USE vehicle_system;

USE vehicle_system; CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) DEFAULT NULL,
  `email` varchar(255) NOT NULL, 
  `password_hash` text NOT NULL, 
  `api_key` varchar(32) NOT NULL, 
  `phone` varchar(14) NOT NULL, 
  `status` int(1) NOT NULL DEFAULT '1', 
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
  PRIMARY KEY (`id`), 
  UNIQUE KEY `email` (`email`), 
  UNIQUE KEY `phone` (`phone`)
);

CREATE TABLE IF NOT EXISTS `vehicle_model` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) DEFAULT NULL,
  `manufacturer_id` int(11) NOT NULL,
  `manufacturer_name` varchar(250) NOT NULL,
  `model` varchar(32) NOT NULL,
  `model_no` varchar(32) NOT NULL,
 `type` varchar(32) NOT NULL,
 `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `manufacturer_id` (`manufacturer_id`)
);

CREATE TABLE IF NOT EXISTS `user_vehicles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  `manufacturer_id` int(11) NOT NULL,
  `vehicle_no` varchar(32) NOT NULL,
  `rc_no` text,
  `engine_type` varchar(32),
  `year` int(4),
  `insurance_exp_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `pollution_exp_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `rc_renew_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `insurance_company` varchar(32),
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `vehicle_no` (`vehicle_no`),
  KEY `user_id` (`user_id`),
  KEY `manufacturer_id` (`manufacturer_id`)
);

这是在MySql 5.7.10上。

这里有一个有趣的讨论:

https://bugs.mysql.com/bug.php?id=41137

创建时间戳字段与其他字段不同!

实际上高达5.6.6你不必声明NOT NULL,因为根据定义该字段是NOT NULL且既没有DEFAULT也没有ON UPDATE子句,它与DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP相同。

5.6.6之后你必须有明确的默认值。看看:

https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html

http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

最后,在您的情况下,删除NOT NULL是最好的方法。

此致