2016-01-15 111 views
1

我完全不熟悉编写SQL代码,我试图运行一个简单的表创建,但是我找不到编程中的错误,而且我是全新的,我正在挣扎与此创作。SQL-无法添加外键约束

这是一个我正在努力的学校项目,希望任何人都可以提供帮助。

我在“SQLFiddle”接收的错误是在下面的代码“无法添加外键约束”:

CREATE TABLE invoice(
    invoice_id INT NOT NULL, 
    customer_id INT NOT NULL, 
    order_date DATE NULL, 
    spec_order_note VARCHAR(45) NULL, 
    PRIMARY KEY(invoice_id, customer_id), 
    FOREIGN KEY (customer_id) 
    REFERENCES customer.customer_id 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
); 

CREATE TABLE line_item (
    invoice_id INT NOT NULL, 
    donut_id INT NOT NULL, 
    quantity INT NULL 
    CONSTRAINT donut_invoice 
    FOREIGN KEY invoice_id 
    REFERENCES invoice.invoice_id 
    ON DELETE RESTRICT 
    ON UPDATE RESTRICT 
) 

CREATE TABLE donut (
    donut_id INT NOT NULL, 
    donut_name VARCHAR(15) NULL, 
    description VARCHAR(30) NULL, 
    unit_price INT NULL 
    PRIMARY KEY(donut_id), 
) 

CREATE TABLE customer (
    customer_id INT NOT NULL, 
    last_name VARCHAR(15) NULL, 
    first_name VARCHAR(10) NULL, 
    street_add VARCHAR(20) NULL, 
    apt_num INT NULL, 
    city VARCHAR(20) NULL, 
    state VARCHAR(15) NULL, 
    zip_code INT NULL, 
    home_phone VARCHAR(10) NULL, 
    mobile_phone VARCHAR(10) NULL, 
    other_phone VARCHAR(10) NULL, 
    customer_notes VARCHAR(45) NULL 
    PRIMARY KEY(customer_id), 
) 

任何帮助是极大的赞赏。

+7

您可能需要创建'customer'表您尝试引用它'invoice'的外键之前。 –

+1

[使用两个外键作为主键--MySQL](http://stackoverflow.com/questions/23488238/using-two-foreign-keys-as-a-primary-key-mysql) - 虽然标题表明这些是不同的,问题的原因和解决方案是相同的。 – Air

回答

1

只能引用外部约束中的现有表和列。所以如果你想参考invoice的外键customer表,你需要在invoice之前创建customer或者使用ALTER TABLE附加外键约束。

除此之外,代码中还有几个语法错误,比如缺少分号和错位(缺失和额外)逗号。

一个工作代码:

CREATE TABLE customer (
    customer_id INT NOT NULL, 
    last_name VARCHAR(15) NULL, 
    first_name VARCHAR(10) NULL, 
    street_add VARCHAR(20) NULL, 
    apt_num INT NULL, 
    city VARCHAR(20) NULL, 
    state VARCHAR(15) NULL, 
    zip_code INT NULL, 
    home_phone VARCHAR(10) NULL, 
    mobile_phone VARCHAR(10) NULL, 
    other_phone VARCHAR(10) NULL, 
    customer_notes VARCHAR(45) NULL, 
    PRIMARY KEY(customer_id) 
); 

CREATE TABLE invoice(
    invoice_id INT NOT NULL, 
    customer_id INT NOT NULL, 
    order_date DATE NULL, 
    spec_order_note VARCHAR(45) NULL, 
    PRIMARY KEY(invoice_id, customer_id), 
    FOREIGN KEY (customer_id) 
    REFERENCES customer (customer_id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
); 

CREATE TABLE line_item (
    invoice_id INT NOT NULL, 
    donut_id INT NOT NULL, 
    quantity INT NULL, 
    CONSTRAINT donut_invoice 
    FOREIGN KEY (invoice_id) 
    REFERENCES invoice (invoice_id) 
    ON DELETE RESTRICT 
    ON UPDATE RESTRICT 
); 

CREATE TABLE donut (
    donut_id INT NOT NULL, 
    donut_name VARCHAR(15) NULL, 
    description VARCHAR(30) NULL, 
    unit_price INT NULL, 
    PRIMARY KEY(donut_id) 
); 

http://sqlfiddle.com/#!9/36b044