2016-09-21 190 views
-1

我的代碼如下:奇怪的語法錯誤6.3

CREATE DATABASE IF NOT EXISTS store; 

CREATE TABLE IF NOT EXISTS customer (

customer_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 

first_name VARCHAR(20) NOT NULL, 

middle_name VARCHAR(20), 

last_name VARCHAR(40) NOT NULL, 

email VARCHAR(60) NOT NULL, 

usr_pword CHAR(10) NOT NULL, 

reg_date DATE, 

PRIMARY KEY (customer_id), 

FOREIGN KEY (rental_id) REFERENCES (rental_id), 

UNIQUE (email) 

); 

CREATE TABLE IF NOT EXISTS rental (

rental_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 

date_out DATE NOT NULL, 

date_in DATE NOT NULL, 

cost INTEGER NOT NULL, 

PRIMARY KEY (rental_id), 

FOREIGN KEY (customer_id) REFERENCES (customer_id), 

FOREIGN KEY (game_id) REFERENCES (game_id) 

); 

CREATE TABLE IF NOT EXISTS game (

game_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 

game_name VARCHAR(60), 

game_publisher VARCHAR(20), 

PRIMARY KEY (game_id), 

FOREIGN KEY (rental_id) REFERENCES (rental_id) 

); 

和我得到的錯誤: 錯誤代碼1064,您在您的SQL語法錯誤...近「rental_id UNIQUE(電子郵件));」

回答

3

此行有一個聲明外鍵無效語法:

FOREIGN KEY (rental_id) REFERENCES (rental_id), 

您必須聲明引用的表中的任何外鍵的定義。然後在表名後面,在圓括號內的表中聲明引用的列。例如:

FOREIGN KEY (rental_id) REFERENCES `ReferencedTable` (rental_id), 

您應該學會閱讀SQL語法文檔,因爲它擁有對此問題及其他問題的答案。例如,http://dev.mysql.com/doc/refman/5.7/en/create-table.html顯示的外鍵引用的語法:

reference_definition: 
    REFERENCES tbl_name (index_col_name,...) 
     [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] 
     [ON DELETE reference_option] 
     [ON UPDATE reference_option] 

通知tbl_name如何遵循REFERENCES關鍵字,然後後列的組合列表。

檢查語法參考文檔應該是你解決語法錯誤的第一種方法,就像你得到的那樣。

+0

即使沒有閱讀文檔,它應該很明顯在外鍵約束中需要表名。 FK的全部重點是與另一張桌子相關,並且需要知道哪張桌子。 – Barmar

+0

@Barmar,沒錯,但期望DBMS知道明確的案例並做正確的事情可能是合理的。在這種情況下,只有一個表的主鍵名爲'rental_id'。另一個例子是,如果JOIN查詢中的列是明確的,則不必使用表名進行限定。另外,儘管MySQL不支持這個選項,但SQL中的外鍵如果與FK列名相同,可能會省略引用的列名。 –

+0

謝謝,但是當我這樣做,我得到一個錯誤,聲稱我沒有我指的關鍵,但我這樣做,你會碰巧知道爲什麼? (我的代碼中的唯一更改是在外鍵引用之前具有表名) – Harvey