このような制約は、制約を使用して ACE/JET に実際に実装できCHECKます。
通常、この種の可能性のためにトリガーを使用すると述べた人は、ACE/Jet と SQL Server のそれぞれの制約の違いを認識していませんCHECK。SQL Server では、サブクエリを含めることはできません。つまり、他の行の値を参照することはできません。同じテーブルまたは他のテーブルに、ACE/Jet では可能です。
理想的な (しかしまだ存在しない) SQL-92 製品では、記述された一意性はASSETION、スキーマ レベルである を使用して実装されます。CHECK 制約はテーブル レベルであり、それらが定義されているテーブルがUPDATEd またはINSERTed である場合にのみチェックされるため、すべての参照テーブルに適切な制約を設定する必要があり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
)
;