2011-11-09 53 views
0

创建表我试图运行下面的SQL脚本:得到错误,而在MySQL

CREATE TABLE part 
(Partno CHAR(4) PRIMARY KEY, 
Partdesc VARCHAR(20), 
Onhand INTEGER, 
Partclass CHAR(2) check (Partclass IN ('AP','HW','KI','SP')), 
Unitprice DECIMAL(6,2) 
); 


CREATE TABLE salesrep 
(Srepno  CHAR(3), 
Srepname VARCHAR(25), 
Srepstreet VARCHAR(30), 
Srepcity VARCHAR(15) NOT NULL, 
Srepprov VARCHAR(3) NOT NULL, 
Sreppcode VARCHAR(6) NOT NULL, 
Totcomm DECIMAL(8,2), 
Commrate DECIMAL(3,2), 
CONSTRAINT pkslsrep PRIMARY KEY (Srepno) 
); 


CREATE TABLE customer 
(Custno  CHAR(3), 
Custname VARCHAR(25) NOT NULL, 
Custstreet VARCHAR(30) NOT NULL, 
Custcity VARCHAR(15) NOT NULL, 
Custprov VARCHAR(3) NOT NULL, 
Custpcode VARCHAR(6) NOT NULL, 
Disc  DECIMAL(3,1), 
Balance DECIMAL(7,2), 
Credlimit DECIMAL(5), 
Srepno  CHAR(3), 
CONSTRAINT pkcustno PRIMARY KEY (Custno), 
CONSTRAINT fksrepno FOREIGN KEY (Srepno) REFERENCES salesrep(Srepno) 
); 


CREATE TABLE orders 
(Orderno CHAR(5) UNIQUE NOT NULL, 
Orderdate DATE, 
Custno CHAR(3) NOT NULL, 
CONSTRAINT fkordercust FOREIGN KEY (Custno) REFERENCES customer (Custno) 
); 


CREATE TABLE orderprod 
(Orderno CHAR(5), 
Partno  CHAR(4), 
Orderqty INTEGER CHECK (Orderqty>0), 
Orderprice DECIMAL(7,2), 
CONSTRAINT pkorderprod PRIMARY KEY (Orderno, Partno), 
CONSTRAINT fkordprdord FOREIGN KEY (Orderno) REFERENCES orders(Orderno), 
CONSTRAINT fkordprdpar FOREIGN KEY (Partno) REFERENCES part(Partno) 
); 


CREATE TABLE invoice 
(Invno  CHAR(6), 
    Invdate DATE, 
    Orderno CHAR(5), 
    CONSTRAINT fkinvoice FOREIGN KEY (Orderno) REFERENCES orders(Orderno), 
    CONSTRAINT pkinvoice PRIMARY KEY (Invno) 
); 


CREATE TABLE invprod 
(Invno  CHAR(6), 
    Partno  CHAR(4), 
    Shipqty INTEGER CHECK (Shipqty>0), 
    CONSTRAINT fkinvoice FOREIGN KEY (Invno) REFERENCES invoice(Invno), 
    CONSTRAINT fkpart FOREIGN KEY (Partno) REFERENCES part(Partno) 
); 

DROP TABLE invprod; 
DROP TABLE invoice; 
DROP TABLE orderprod; 
DROP TABLE orders; 
DROP TABLE customer; 
DROP TABLE salesrep; 
DROP TABLE part;* 

我不能创建表invprod。我收到错误:69无法创建表'sh.invprod'(errno:121)。我在这个脚本中犯了什么错误?

+0

如果您执行'show innodb status',则在输出中间埋入一个更详细的“最后一个错误”部分,该部分应该更好地解释为什么无法创建表。 –

+0

您使用的是哪个版本的MySQL?我刚刚在5.1.57上试过了,它运行良好 – DaveyBoy

+0

你的脚本对我来说工作正常,除了最后删除'*'。你使用的是什么版本的SQLite? – Dave

回答

2

CONSTRAINT fkinvoice已被定义为CREATE TABLE invoice的一部分。约束名称应该像表或索引一样是唯一的。

+0

-1:键名是每个表。在一个表中具有'fkinvoice'并不妨碍您在另一个表中拥有相同的密钥名称。 –

+0

是的。错误121是重复键错误。 –

+0

@Marc B:如果给出了'CONSTRAINT symbol'子句,'symbol'值在数据库中必须是唯一的。请参阅:http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html – Raihan