帮助为hsqldb创建模式sql

时间:2011-07-21 06:59:19

标签: schema hsqldb

我对数据库编程很陌生,我正在尝试使用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>

1 个答案:

答案 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

删除架构中的所有现有对象。