2016-04-17 19 views
0

我正在創建一個SQL腳本並將其導入到phpMyAdmin中。下面是代碼:phpMyAdamin中的SQL腳本錯誤 - 外鍵約束

DROP DATABASE IF EXISTS Carpool; 
CREATE DATABASE Carpool; 
USE Carpool; 

CREATE TABLE IF NOT EXISTS users (
    username varchar(100) NOT NULL, 
    firstname varchar(100) NOT NULL, 
    lastname varchar(100) NOT NULL, 
    age   int(10)   NOT NULL, 
    email  varchar(100) NOT NULL, 
    gender  varchar(1)  NOT NULL, 
    passhash varchar(100) NOT NULL, 
    PRIMARY KEY(username) 
); 

CREATE TABLE IF NOT EXISTS cars (
    car_id  int(50)  NOT NULL AUTO_INCREMENT, 
    cartype  varchar(50), 
    neatness varchar(50), 
    color  varchar(50), 
    seats  int(50), 
PRIMARY KEY(car_id) 
); 

CREATE TABLE IF NOT EXISTS startinglocation (
    startinglocation_id int(100)  NOT NULL AUTO_INCREMENT, 
    address    varchar(200) NOT NULL, 
    zipcode    varchar(50)  NOT NULL, 
    city    varchar(50)  NOT NULL, 
    state    varchar(50)  NOT NULL, 
    longitude   float(10)  NOT NULL, 
    latitude   float(10)  NOT NULL, 
PRIMARY KEY(startinglocation_id) 
); 

CREATE TABLE IF NOT EXISTS endinglocation (
    endinglocation_id int(100)  NOT NULL AUTO_INCREMENT, 
    address    varchar(200) NOT NULL, 
    zipcode    varchar(50)  NOT NULL, 
    city    varchar(50)  NOT NULL, 
    state    varchar(50)  NOT NULL, 
    longitude   float(10)  NOT NULL, 
    latitude   float(10)  NOT NULL, 
PRIMARY KEY(endinglocation_id) 
); 

CREATE TABLE IF NOT EXISTS carpool (

    car_id    int(50), 
    carpool_id   int(50) NOT NULL AUTO_INCREMENT, 
    datetime   varchar(50), 
    duration   varchar(50), 
    numberofpassengers int(10), 
    startingtime  varchar(50) NOT NULL, 
    endingtime   varchar(50) NOT NULL, 
    recurrencelevel  int(10), 
    startinglocation_id int(100), 
    endinglocation_id int(100), 
PRIMARY KEY(carpool_id), 
FOREIGN KEY(car_id) 
    REFERENCES cars(car_id) 
    ON DELETE SET NULL ON UPDATE CASCADE, 
FOREIGN KEY(startinglocation_id) 
    REFERENCES startinglocation(startinglocation_id) 
    ON DELETE SET NULL ON UPDATE CASCADE, 
FOREIGN KEY(endinglocation_id) 
    REFERENCES endinglocation(endinglocation_id) 
    ON DELETE SET NULL ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS driver (
    username varchar(50) NOT NULL, 
    carpool_id int(50)  NOT NULL, 
FOREIGN KEY (username) 
    REFERENCES users(username) 
    ON DELETE SET NULL ON UPDATE CASCADE, 
FOREIGN KEY (carpool_id) 
    REFERENCES carpool(carpool_id) 
    ON DELETE SET NULL ON UPDATE CASCADE 
); 

CREATE TABLE IF NOT EXISTS passenger (
    username  varchar(50) NOT NULL, 
    carpool_id  int(50)  NOT NULL, 
FOREIGN KEY (username) 
    REFERENCES users(username) 
    ON DELETE SET NULL ON UPDATE CASCADE, 
FOREIGN KEY (carpool_id) 
    REFERENCES carpool(carpool_id) 
    ON DELETE SET NULL ON UPDATE CASCADE 
); 

GRANT SELECT, INSERT, UPDATE, DELETE 
ON * 
TO mgs_user 
IDENTIFIED BY 'Password1'; 

而且我收到這樣的錯誤報告:

錯誤 SQL查詢:

CREATE TABLE IF NOT EXISTS carpool (

    car_id    int(50), 
    carpool_id   int(50) NOT NULL AUTO_INCREMENT, 
    datetime   varchar(50), 
    duration   varchar(50), 
    numberofpassengers int(10), 
    startingtime  varchar(50) NOT NULL, 
    endingtime   varchar(50) NOT NULL, 
    recurrencelevel  int(10), 
    startinglocation_id int(100), 
    endinglocation_id int(100), 
PRIMARY KEY(carpool_id), 
FOREIGN KEY(car_id) 
    REFERENCES cars(car_id) 
    ON DELETE SET NULL ON UPDATE CASCADE, 
FOREIGN KEY(startinglocation_id) 
    REFERENCES startinglocation(startinglocation_id) 
    ON DELETE SET NULL ON UPDATE CASCADE, 
FOREIGN KEY(endinglocation_id) 
    REFERENCES endinglocation(endinglocation_id) 
    ON DELETE SET NULL ON UPDATE CASCADE 
) 

MySQL表示:文件

1005 - 燦」 t創建表carpool。 (錯誤:150「外鍵約束不正確」)(詳細信息...)

我覺得我正確地引用了外鍵的表格,但是我已經嘗試了一些小改動但沒有成功。

+0

您無法引用尚未定義的表格。所以改變表格創建的順序。 –

+0

我編輯了上面的代碼以顯示這是我嘗試過的方法。我確定所有的外鍵都是在被引用的表之後創建的。它正在產生同樣的錯誤。 –

+1

driver.username和users.username不是相同類型(長度)。你爲什麼不使用auto_incrementing user_id? –

回答

1

carpool表引用了startinglocationendinglocation表,因此需要在表之後創建表。

只需在腳本開始處更改創建順序,執行startinglocationendinglocation表,它應該可以工作。

@Paul Spiegel向您提出了問題第二部分的答案:driverpassenger表引用users.username以不同類型。

+0

我編輯了上面的代碼以顯示這是我嘗試過的方法。我確定所有的外鍵都是在被引用的表之後創建的。它正在產生同樣的錯誤。 –

+0

明白了。 @Paul Spiegel創建了auto_incrementing user_id,並將類型更改爲相同長度的int。對於NOT NULL列刪除ON DELETE SET NULL。根據Anthony Drogon驗證了正確的表格順序。謝謝您的幫助。 –