帮助为 hsqldb 创建模式 sql
Posted
技术标签:
【中文标题】帮助为 hsqldb 创建模式 sql【英文标题】:help creating schema sql for hsqldb 【发布时间】:2011-07-21 06:59:19 【问题描述】:我对数据库编程很陌生,正在尝试创建一个 java 程序来使用 hibernate 访问 hsqldb(version2.2.5)。我的程序中有 3 个类,我将它们映射到 3 个表下面给出。
我想在 SaleOrder 和 Bill 之间创建一个一对一的映射。 此外,为了为数据库创建模式,我尝试了 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;
然而,这在第一次运行时会导致问题(因为要更改的表不存在。)。我找不到 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】:删除表之前不需要 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
这会删除架构中的所有现有对象。
【讨论】:
第一次在没有表的情况下工作。但是当我第二次尝试时,我在 DROP TABLE SALEORDER IF EXISTS CASCADE 上得到一个空指针异常。 我先使用 drop schema 并运行 sql。它工作。当我再次运行它时,它抛出空指针异常。这是 sql 脚本pastebin.com/RgWUp0CY连续运行的输出 我正在使用 ant 目标创建架构。我已将其添加到上面的帖子中 关于schama设计,最好不要使用FK_SO_BILL。账单取决于销售订单,但不取决于其他方式。当您尝试插入新账单时,FK 会导致问题。 感谢您的反馈。删除循环外键存在问题。现在已为下一个 HSQLDB 点版本修复此问题以上是关于帮助为 hsqldb 创建模式 sql的主要内容,如果未能解决你的问题,请参考以下文章
hsql建立好文件后,在链接server模式时出现java。sql.SQLException:socket creation error 怎么解决 谢谢