我对数据库编程很陌生,我正在尝试使用hibernate创建一个java程序来访问 hsqldb (version2.2.5)。我的程序中有3个类,我映射到3个表作为如下所示。
我想在SaleOrder和Bill之间创建一个一对一的映射。 另外,要为db创建模式,我尝试了sql create语句。 两个表SALEORDER和BILL将彼此的id作为FK。为了避免在创建期间表之间的依赖性错误,我使用了 alter table add constraint 语句
现在,我想在脚本开头使用drop table语句。我使用了以下
ALTER TABLE SALEORDER DROP CONSTRAINT FK_SO_BILL;
ALTER TABLE SALEORDER DROP CONSTRAINT FK_SO_BUYER;
ALTER TABLE BILL DROP CONSTRAINT FK_BILL_SO;
ALTER TABLE BILL DROP CONSTRAINT FK_BILL_BUYER;
DROP TABLE BUYER IF EXISTS;
DROP TABLE SALEORDER IF EXISTS;
DROP TABLE BILL IF EXISTS;
然而,这在第一次运行时会导致问题(因为要更改的表不存在。)。我找不到 ALTER TABLE的'IF EXISTS'子句在hsqldb中。那么解决方案是什么?我是否应该第一次单独运行create table脚本,然后添加上面显示的alter table,drop table语句?这听起来并不干净。
非常感谢你的建议,
此致
吉姆
主模式脚本是
CREATE TABLE BUYER(
BUYER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
NAME VARCHAR(100)
);
CREATE TABLE SALEORDER(
SALEORDER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
BUYER_ID BIGINT NOT NULL,
BILL_ID BIGINT,
);
CREATE TABLE BILL(
BILL_ID BIGINT NOT NULL PRIMARY KEY IDENTITY,
BUYER_ID BIGINT NOT NULL,
SALEORDER_ID BIGINT NOT NULL,
);
ALTER TABLE SALEORDER ADD CONSTRAINT FK_SO_BILL FOREIGN KEY(BILL_ID) REFERENCES BILL(BILL_ID);
ALTER TABLE SALEORDER ADD CONSTRAINT FK_SO_BUYER FOREIGN KEY(BUYER_ID) REFERENCES BUYER(BUYER_ID);
ALTER TABLE BILL ADD CONSTRAINT FK_BILL_BUYER FOREIGN KEY(BUYER_ID) REFERENCES BUYER(BUYER_ID);
ALTER TABLE BILL ADD CONSTRAINT FK_BILL_SO FOREIGN KEY(SALEORDER_ID) REFERENCES SALEORDER(SALEORDER_ID);
另外,我正在使用ant目标来创建架构
<target name="createschema" description="execute schema">
<sql
driver="${db.driver}"
url="${db.url}"
userid="${db.username}"
password="${db.password}"
print="yes"
src="${dir.schema}/${file.schema}"
caching="false"
showheaders="true"
>
<classpath>
<path location="${dir.lib}/hsqldb.jar"/>
</classpath>
</sql>
</target>
答案 0 :(得分:1)
在删除表之前,不需要ALTER TABLE语句。
使用CASCADE关键字强制删除外键约束。
DROP TABLE BUYER IF EXISTS CASCADE
DROP TABLE SALEORDER IF EXISTS CASCADE
DROP TABLE BILL IF EXISTS CASCADE
也可以使用
DROP SCHEMA PUBLIC CASCADE
删除架构中的所有现有对象。