我正在研究数据库,目前正在研究对象关系数据库项目,我遇到了一个关于对象表中可能的约束数量的小问题。我正在使用Hector Garcia-Molina(和其他作者)的“数据库系统:完整的书”作为参考,并且有一个像这样的通用SQL示例:
CREATE TYPE StarType AS (
name CHAR(30),
address AddressType,
bestMovie REF(MovieType) SCOPE Movies
);
现在,我的项目中有一种类似的类型,因为它也使用类型中的另一种类型的引用,但是在那里放置引用的子句不包括Oracle中的SCOPE(至少我没有' t在文档中找到它并输出错误)。所以我有这样的类型:
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列提供约束?
答案 0 :(得分:5)
这很好用:
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来进行类似的测试。