2009-11-09 175 views
1

我正在学习数据库,目前正在研究一个对象关系数据库项目,并且在对象表中遇到了一些可能的约束条件的小问题。我使用的是“数据库系统:全书”,由赫克托·加西亚 - 莫利纳(和其他作者)作为参考,有这样一个一般的SQL例如:类型参考范围

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

现在,我有一种类似的键入我的项目,因为它也使用了对类型内其他类型的引用,但是用于放置引用的子句在Oracle中不包含SCOPE(至少我没有在文档中找到它并输出错误) 。所以我有这样的一个类型:

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

当你同时尝试时会发生什么?你会得到什么错误信息? – 2009-11-09 15:27:28

+0

我得到“ORA-00904::invalid identifier”错误。但是,当我单独使用这些约束中的任何一个时,表格通常会创建。 – 2009-11-09 15:46:05

回答

4

这只是正常:

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,因为refered值不在指定的范围的表(其是竞赛,而不是伪Competitions2 )。 您可以使用People2而不是People来测试。

+0

谢谢你的回答,马吕斯。我没有用户“或”,当我得到那个错误时,我的代码看起来和你的完全一样(除了我有用“”包围的表,类型和属性名称)。我再次尝试,再次创建所有类型和表,但它仍然不适用于我,即使没有“”(尽管它不应该与它有关)?我的代码看起来和你的完全一样。 – 2009-11-10 17:44:17

+0

请编辑您的问题并发布您使用的整个SQL(CREATE TYPE/TABLE,INSERTS等),以便我可以查看它。 – 2009-11-10 18:50:18

+0

我刚刚检查过我的代码,我的CREATE TABLE语句中有一个愚蠢的错字错误,在产生SQL错误的最后一个约束结尾处有一个彗星。它现在有效。 :)感谢您对约束测试的帮助和建议! – 2009-11-10 20:44:51