由于试图创建表的外键约束导致的 SQL 异常

Posted

技术标签:

【中文标题】由于试图创建表的外键约束导致的 SQL 异常【英文标题】:SQL exception due to foreign key constraint trying to create tables 【发布时间】:2011-07-20 06:41:53 【问题描述】:

我试图使用以下脚本创建一组表:

DROP TABLE ORDERS IF EXISTS;
DROP TABLE INVOICE IF EXISTS;
CREATE TABLE ORDERS(
    ORDER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
    ...
    INVOICE_ID BIGINT,
    ...
    );

CREATE TABLE INVOICE(
    INVOICE_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
    ...
    ORDER_ID BIGINT,
    ...
    FOREIGN KEY(ORDER_ID) REFERENCES ORDERS(ORDER_ID)
);
ALTER TABLE ORDERS ADD FOREIGN KEY(INVOICE_ID) REFERENCES INVOICE(INVOICE_ID);

这会导致sql异常

java.sql.SQLException: 被 FOREIGN KEY 约束引用: PUBLIC.INVOICE.SYS_FK_10079 在语句 [ DROP TABLE ORDERS IF 存在]

我不知道如何解决这个问题..我需要 ORDERS 表中的 invoiceId 和 INVOICE 表中的 OrderID 作为外键..这就是我使用 ALTER TABLE 语句的原因..仍然,它似乎是错误的.. (顺便说一句,我正在使用 hsqldb)

我想知道如何正确地做到这一点。欢迎任何帮助..

【问题讨论】:

我建议您将约束放在 Create Table 语句中以获得更好的可读性。 将 FOREIGN KEY(INVOICE_ID) REFERENCES INVOICE(INVOICE_ID) 放入 CREATE_TABLE ORDERS 会导致 INVOICE_ID not found 错误消息 对于一些测试表,这对我来说运行得很好 【参考方案1】:

先删除订单的外键:

ALTER TABLE ORDERS DROP FOREIGN KEY(INVOICE_ID) REFERENCES INVOICE(INVOICE_ID);

然后运行你的命令。

【讨论】:

我试过 [sql] 执行失败:ALTER TABLE ORDERS DROP FOREIGN KEY(INVOICE_ID) REFERENCES INVOICE(INVOICE_ID) BUILD FAILED java.sql.SQLException: 用户缺少权限或找不到对象: FOREIGN

以上是关于由于试图创建表的外键约束导致的 SQL 异常的主要内容,如果未能解决你的问题,请参考以下文章

批量执行语句之——禁用所有表的外键

如何在sqlyog设置表的外键

sql 删除带外键约束的表的语句是啥

Oracle外键需要建索引吗?

在SQL中如何创建外键约束?

mysql数据库怎么删除一个表的外键