我是数据库编程的新手,我正在尝试使用hibernate创建一个java程序来访问hsqldb(version2.2.5) . 我的程序中有3个类,我映射到3个表,如下所示 .
我想在SaleOrder和Bill之间创建一对一的映射 . 另外,要为db创建模式,我尝试了sql create语句 . 两个表SALEORDER和BILL将彼此的id作为FK . 为了避免在创建期间表之间的依赖性错误,我使用了alter table add constraint statements
现在,我想在脚本的开头使用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;
但是,这会在第一次运行时导致问题(因为要更改的表不存在 . ) . 我找不到hsqldb中ALTER TABLE的'IF EXISTS'子句 . 那么解决方案是什么?我应该运行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>
1 回答
在删除表之前不需要ALTER TABLE语句 .
使用CASCADE关键字强制删除外键约束 .
也可以用
这会删除架构中的所有现有对象 .