Такие ограничения действительно могут быть реализованы в ACE / JET с использованием ограничений CHECK
.
Человек, который сказал, что обычно использует триггеры для такого рода вещей, не знает о разнице между CHECK
ограничениями в ACE / Jet и SQL Server соответственно: в SQL Server они не могут включать подзапросы, то есть не могут ссылаться на значения в других строках той же таблицы или в других таблицах, тогда как в ACE / Jet это возможно.
В идеальном (но еще не существующем AFAIK) продукте 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
s и CHECK
уровня строки (или валидацию) Правила, если вам удобнее использовать интерфейс MS Access, чем SQL DLL, что требуется для ограничений CHECK
). Логика будет легче реализовать, чем ограничения на уровне таблицы 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
)
;