首页 文章

帮助为hsqldb创建模式sql

提问于
浏览
2

我是数据库编程的新手,我正在尝试使用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 回答

  • 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
    

    这会删除架构中的所有现有对象 .

相关问题