このような制約は、制約を使用して ACE/JET に実際に実装できCHECK
ます。
通常、この種の可能性のためにトリガーを使用すると述べた人は、ACE/Jet と SQL Server のそれぞれの制約の違いを認識していませんCHECK
。SQL Server では、サブクエリを含めることはできません。つまり、他の行の値を参照することはできません。同じテーブルまたは他のテーブルに、ACE/Jet では可能です。
理想的な (しかしまだ存在しない) SQL-92 製品では、記述された一意性はASSETION
、スキーマ レベルである を使用して実装されます。CHECK 制約はテーブル レベルであり、それらが定義されているテーブルがUPDATE
d またはINSERT
ed である場合にのみチェックされるため、すべての参照テーブルに適切な制約を設定する必要がありCHECK
ます (SQL Server トリガーにも同じことが適用されます)。簡単な例を次に示します。
CREATE TABLE Parent
(
parent_ID INTEGER NOT NULL IDENTITY UNIQUE,
data_col INTEGER NOT NULL
)
;
CREATE TABLE Child1
(
parent_ID INTEGER NOT NULL
REFERENCES parent (parent_ID),
data_col INTEGER NOT NULL
)
;
CREATE TABLE Child2
(
parent_ID INTEGER NOT NULL
REFERENCES parent (parent_ID),
data_col INTEGER NOT NULL
)
;
ALTER TABLE Child1 ADD
CONSTRAINT child1__no_dups_in_child2
CHECK (NOT EXISTS (
SELECT *
FROM Child1 AS C1
INNER JOIN Child2 AS C2
ON C1.parent_ID = C2.parent_ID
))
;
ALTER TABLE Child2 ADD
CONSTRAINT child2__no_dups_in_child1
CHECK (NOT EXISTS (
SELECT *
FROM Child1 AS C1
INNER JOIN Child2 AS C2
ON C1.parent_ID = C2.parent_ID
))
;
FOREIGN KEY
ただし、サブクラスがあるかどうかは疑問です (つまり、ID で表される各エンティティを型指定できます)。その場合、 s と行レベルのCHECK
制約 (または MS に慣れている場合は検証規則)を使用できるはずです。CHECK
制約に必要な SQL DLL よりもアクセス インターフェイス)。このロジックは、テーブル レベルのCHECK
制約よりも簡単に実装できますCASCADE
。参照アクションの循環に注意するだけです。別の簡単な例を次に示します。
CREATE TABLE Parent
(
parent_ID INTEGER NOT NULL IDENTITY,
child_type VARCHAR(4) NOT NULL,
CONSTRAINT child_type__values
CHECK (child_type IN ('Boy', 'Girl')),
UNIQUE (child_type, parent_ID)
)
;
CREATE TABLE Girls
(
parent_ID INTEGER NOT NULL,
child_type VARCHAR(4) DEFAULT 'girl' NOT NULL,
CONSTRAINT girl_child_type__must_be_girl
CHECK (child_type = 'girl'),
FOREIGN KEY (child_type, parent_ID)
REFERENCES Parent (child_type, parent_ID),
data_col INTEGER NOT NULL
)
;
CREATE TABLE Boys
(
parent_ID INTEGER NOT NULL,
child_type VARCHAR(4) DEFAULT 'boy' NOT NULL,
CONSTRAINT boy_child_type__must_be_boy
CHECK (child_type = 'boy'),
FOREIGN KEY (child_type, parent_ID)
REFERENCES Parent (child_type, parent_ID),
data_col INTEGER NOT NULL
)
;