2016-03-12 2 views
1
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`) 
); 

При выполнении выше запроса я получаюОшибка при создании таблицы в MySQL

#1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

Но я не вижу штамп времени два по умолчанию в запросе, Может ли один указать, что может быть возможная ошибка. Это потому, что текущая метка времени присутствует в таблице users? Если да, то как избавиться от этого?

+0

В какой версии MySQL вы используете? – Reto

+1

Что-то еще происходит над созданием прекрасной работы [скрипт SQL] (http://sqlfiddle.com/#!9/de804/1/0), возможно, ему не нравится использовать систему vehcile дважды. – xQbert

+0

@Reto MySQL обновлен до 5.5.42 PHP 5.4.38, 5.5.22 и 5.6.6 PHPUnit 4.4 phoMyAdmin 4.3.10 – CodeDecode

ответ

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 является лучшим подходом.

С уважением

+0

Я очень благодарен за отзыв. благодаря –

Смежные вопросы