помогите создать схему sql для hsqldb - PullRequest
2 голосов
/ 21 июля 2011

Я довольно новичок в программировании баз данных и пытаюсь создать Java-программу для доступа к hsqldb (версия2.5.5) с помощью hibernate. У меня в программе 3 класса, которые я сопоставил с 3 таблицами, как указано ниже.

Я хотел создать сопоставление один к одному между SaleOrder и Биллом. Кроме того, чтобы создать схему для базы данных, я попытался создать операторы sql. Две таблицы SALEORDER и BILL имеют идентификаторы друг друга как FK. Чтобы избежать ошибок зависимостей между таблицами во время создания, я использовал изменить таблицу добавить ограничение операторы

Теперь я хочу использовать операторы отбрасывания таблиц в начале скрипта. Я использовал следующее

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 в hsqldb .. Так в чем же решение? Стоит ли в первый раз запускать сценарии создания таблицы самостоятельно, а затем добавить таблицу изменений, после чего удалить операторы таблицы, показанные выше?

будем благодарны за ваши предложения,

искренне,

Джим

Основной скрипт схемы:

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 голос
/ 21 июля 2011

Вам не нужны операторы 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

Отбрасывает все существующие объекты в схеме.

...