2011-07-21 51 views
2

我對數據庫編程頗爲陌生,正試圖創建一個Java程序來訪問使用hibernate的hsqldb(version2.2.5)。我的程序中有3個類,我映射到3個表如下所示。幫助爲hsqldb創建模式sql

我想在SaleOrder和Bill之間創建一對一映射。 另外,爲了創建數據庫的模式,我嘗試了sql創建語句。 這兩個表SALEORDER和比爾有作爲FK.To避免表之間的相關性錯誤過程中創建對方的ID,我用ALTER TABLE添加約束聲明

現在,我想在開始時使用DROP TABLE語句script.I使用以下

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; 

然而,這時候第一次(因爲要改變的表不存在)。我找不到「IF存在」爲條款運行導致問題ALTER TABLE in hsqldb ..那麼解決方案是什麼?我應該首先單獨創建表腳本,然後添加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 

而下降模式中的所有現有對象。

+0

第一次沒有表時,它工作。但是當我第二次嘗試時,我得到了DROP TABLE SALEORDER IFOCUSTS CASCADE上的空指針異常。 – jimgardener

+0

我首先使用drop schema並運行sql。它工作正常。當我再次運行它時,它會拋出nullpointer異常。這裏是sql腳本連續運行的輸出http://pastebin.com/RgWUp0CY – jimgardener

+0

我正在創建通過使用螞蟻目標的模式。我已經將它添加到 – jimgardener