2016-09-21 4 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) 

); 

を、私はエラーを取得:あなたのSQL構文でエラーが発生している エラーコード1064 ...近くには、「UNIQUE(メールをrental_id )); '

答えて

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'と呼ばれる主キーを持つテーブルが1つだけあります。もう1つの例は、JOINクエリの列が明白である場合は、テーブル名で修飾する必要がないということです。また、(MySQLはこのオプションをサポートしていませんが)SQLの外部キーは、参照される列名がFK列名と同じであれば省略することがあります。 –

+0

ありがとう、しかし、私はそれを行うとき、私は私が言及しているキーを持っていないと主張するエラーを得るが、私は、あなたはなぜ知っているだろうか? (私のコードの唯一の変更は、外部キー参照の前にテーブル名を持っています) – Harvey