2011-07-21 23 views
2

私はデータベースプログラミングに新しく、アクセスするJavaプログラムを作成しようとしていますhsqldb(version2.2.5)hibernate.Iを使用して3つのクラスを3つのテーブル以下に示すように。hsqldbのスキーマsqlを作成するのに役立ちます

SaleOrderとBillの間にを1対1のマッピングを作成したいと考えました。 また、dbのスキーマを作成するために、sql create文を試しました。 二つのテーブルSALEORDERとBILLはFK.Toが中に作成するテーブル間の依存関係のエラーを回避するよう、お互いのIDを持って、私はALTER 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はEXISTS」を使用しました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

テーブルが1つもなかったときに初めて動作しましたが、2回目に試してみましたが、存在する場合はDROP TABLE SALEORDERにnullpointer例外が発生しています。 – jimgardener

+0

私はドロップスキーマを最初に使用し、SQLを実行しました。それはもう一度それを走らせました。それはnullpointer例外を投げました。SQLスクリプトの連続実行の出力ですhttp://pastebin.com/RgWUp0CY – jimgardener

+0

私は作成していますスキーマはantターゲットを使用しています。私は上記の投稿にそれを追加しました – jimgardener

関連する問題