На таблицу ссылается ограничение в таблице SYS_REF_SYS_FK_272_275 таблица: STAFF2 в операторе [удалить таблицу STAFF]

У меня есть 2 таблицы в проекте, который использует HSQLDB, они называются Staff и Staff2.
Staff имеет Id PRIMARY KEY, как написано здесь:

s.execute("CREATE TABLE Staff(Id varchar(10) PRIMARY KEY, FirstName varchar(30), LastName varchar(30), Department varchar(255))");.   

Staff2 имеет Id FOREIGN KEY ссылку на PRIMARY KEY из Staff, как написано здесь:

s.execute("CREATE TABLE Staff2(Id varchar(10), TeachingCourse varchar(30), UserName varchar(255), FOREIGN KEY(Id) REFERENCES Staff(Id))");.  

Теперь кажется, что, поскольку я не удалял эти ключи, я не могу удалить таблицы. Когда я запускаю программу, она показывает следующую ошибку:

вызвано исключение:

java.sql.SQLException: Table is referenced by a constraint in table SYS_REF_SYS_FK_272_275 table: STAFF2 in statement [drop table STAFF] 

Когда я пытаюсь удалить ключи независимо друг от друга перед удалением таблицы, я получаю другие ошибки:
Когда я делаю:

s.execute("ALTER TABLE Staff DROP PRIMARY KEY"); 

Результат:

вызвано исключение:

java.sql.SQLException: Attempt to drop a foreign key index: SYS_IDX_46 in statement [ALTER TABLE 

Посох DROP PRIMARY KEY]

И когда я делаю:

s.execute("ALTER TABLE Staff2 DROP FOREIGN KEY Id");  

Я получаю:
вызвано исключение:

java.sql.SQLException: Column not found: FOREIGN in statement [ALTER TABLE Staff2 DROP FOREIGN]

Возможно, я использовал Add CONSTRAINT где-то по пути и не закрыл его, но DROP CONSTRAINT тоже не работает (выдает выброшено исключение:

java.sql.SQLException: Constraint not found ID in table: STAFF in statement [ALTER TABLE Staff DROP CONSTRAINT Id]), 

и я не мог понять, как найти ограничения, а также в чем именно смысл этих ограничений и должен ли я их найти.

Теперь я застрял и не могу продолжить, так как таблицы не могут быть удалены, пока не будут удалены ключи.
Закрытие сервера HSQLDB и его перезапуск не привели к закрытию таблиц.
Я также мог бы воспользоваться советом относительно того, как начать все заново и на этот раз сбросить ключи перед сбрасыванием столов с первого раза.


person Achi Even-dar    schedule 27.12.2014    source источник


Ответы (2)


Вы можете удалить таблицы, но вы должны сделать это в обратном порядке. STAFF2 зависит от STAFF, поэтому вы не можете удалить STAFF первым. Вам не нужно удалять ограничения отдельно. Просто выполните следующие две команды:

DROP TABLE STAFF2;
DROP TABLE STAFF;
person rtruszk    schedule 28.12.2014

В HSQLDB вы можете удалить любую таблицу, даже если есть ограничения FOREIGN KEY, которые ссылаются на ограничения PRIMARY KEY или UNIQUE. Просто используйте ключевое слово CASCADE в конце оператора DROP TABLE. Любые такие ограничения FROEIGN KEY также будут удалены.

DROP TABLE STAFF CASCADE

Решение, данное rtruszk, является хорошим, потому что его выполнение займет меньше времени, когда база данных велика, а таблицы КЭШИРОВАНЫ.

person fredt    schedule 15.02.2015