2016-09-21 238 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