1

私はデータベースを研究していて、現在オブジェクトリレーショナルDBプロジェクトに取り組んでいますが、オブジェクトテーブルで発生する可能性のある制約の数に小さな問題が発生しました。私はHectorGarcia-Molina(および他の著者)による「DatabaseSystems:The Complete Book」を参照として使用しており、次のような一般的な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列を制約する場合は、次のように1つしか制約できません。

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

両方のREF列に制約を与える方法はありますか?

4

1 に答える 1

5

これはうまくいきます:

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

おそらく、制約を分離するor代わりに使用してテーブルを作成しようとしました(コメントに見られるように)。,

制約をテストするのも簡単です。次の 2 つの追加のダミー テーブルを作成するだけです。

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
);

参照された値が指定されたスコープ テーブル (ダミーのコンペティション 2 ではなくコンペティション) にないため、結果は ORA-22889 になります。People の代わりに People2 を使用して、同様にテストできます。

于 2009-11-09T18:24:40.740 に答える