Введите справочную область - PullRequest
1 голос
/ 09 ноября 2009

Я изучаю базы данных и в настоящее время работаю над проектом объектно-реляционной БД, и я столкнулся с небольшой проблемой с количеством возможных ограничений в таблице объектов. Я использую «Системы баз данных: Полная книга» Гектора Гарсиа-Молина (и других авторов) в качестве справочного материала, и есть общий пример SQL, подобный этому:

CREATE TYPE StarType AS (
  name CHAR(30),
  address AddressType,
  bestMovie REF(MovieType) SCOPE Movies
);

Теперь у меня есть похожий тип в моем проекте, так как он также использует ссылку на другой тип в типе, но пункт для размещения ссылки там не включает SCOPE в Oracle (по крайней мере, у меня нет ' я нашел его в документации и выдает ошибку). Итак, у меня есть такой тип:

CREATE OR REPLACE TYPE "ApplicationType" AS OBJECT (
  "person" REF "PersonType",
  "competition" REF "CompetitionType",
  "dateApplied" DATE
);
/

... который работает. Но когда я хочу ограничить столбцы REF, я могу ограничить только один, например:

CREATE TABLE "Applications" OF "ApplicationType" (
  "person" SCOPE IS "People" /* or "competition" SCOPE IS "Competitions" */
)
OBJECT IDENTIFIER IS SYSTEM GENERATED;

Есть ли способ задать ограничения для обоих столбцов REF?

1 Ответ

5 голосов
/ 09 ноября 2009

Это прекрасно работает:

CREATE TABLE Applications OF ApplicationType (
  person SCOPE IS People,
  competition SCOPE IS Competitions
)
OBJECT IDENTIFIER IS SYSTEM GENERATED;

Возможно, вы попытались создать таблицу, используя or вместо , для разделения ограничений (как видно из вашего комментария).

Также легко проверить ваши ограничения. Просто создайте эти две дополнительные фиктивные таблицы:

CREATE TABLE People2 OF PersonType
OBJECT IDENTIFIER IS SYSTEM GENERATED;

CREATE TABLE Competitions2 OF CompetitionType
OBJECT IDENTIFIER IS SYSTEM GENERATED;

Тогда:

INSERT INTO People VALUES('p1');
INSERT INTO People2 VALUES('p21');
INSERT INTO Competitions VALUES('c1');
INSERT INTO Competitions2 VALUES('c21');
COMMIT;
INSERT INTO Applications
VALUES
(
   (SELECT REF(p) FROM People p WHERE person = 'p1'),
   (SELECT REF(c) FROM Competitions2 c WHERE competition = 'c21'),
   SYSDATE
);

приводит к ORA-22889, так как указанное значение отсутствует в указанной таблице с областями действия (то есть «Соревнования», а не фиктивные «Соревнования» 2). Вы можете протестировать аналогичным образом, используя People2 вместо People.

...