这是标准 SQL-92 入门级语法,即使用“vanilla”语法,例如CHECK
在 SQL 产品中广泛实现的外键和行级约束(尽管特别是不是 mySQL):
CREATE TABLE Parent
(
ParentID INTEGER NOT NULL,
MaxChildren INTEGER NOT NULL
CHECK (MaxChildren > 0),
UNIQUE (ParentID),
UNIQUE (ParentID, MaxChildren)
);
CREATE TABLE Child
(
ParentID INTEGER NOT NULL,
MaxChildren INTEGER NOT NULL,
FOREIGN KEY (ParentID, MaxChildren)
REFERENCES Parent (ParentID, MaxChildren)
ON DELETE CASCADE
ON UPDATE CASCADE,
OccurrenceNumber INTEGER NOT NULL,
CHECK (OccurrenceNumber BETWEEN 1 AND MaxChildren),
UNIQUE (ParentID, OccurrenceNumber)
);
我建议您避免使用位标志列。相反,您可以有第二个表而没有限制,MaxChildren
然后根据行出现在哪个表中暗示启用列。您可能需要三个表来对此建模:所有子表的超类型表以及启用的子类型表。VIEW
然后,您可以UNION
使用隐含的 Enabled 列创建两个子类型,例如
CREATE TABLE Parents
(
ParentID INTEGER NOT NULL,
MaxChildren INTEGER NOT NULL
CHECK (MaxChildren > 0),
UNIQUE (ParentID),
UNIQUE (ParentID, MaxChildren)
);
CREATE TABLE Children
(
ChildID INTEGER NOT NULL,
ParentID INTEGER NOT NULL,
MaxChildren INTEGER NOT NULL,
FOREIGN KEY (ParentID, MaxChildren)
REFERENCES Parents (ParentID, MaxChildren)
ON DELETE CASCADE
ON UPDATE CASCADE,
UNIQUE (ChildID),
UNIQUE (ChildID, MaxChildren),
);
CREATE TABLE EnabledChildren
(
ChildID INTEGER NOT NULL,
MaxChildren INTEGER NOT NULL,
FOREIGN KEY (ChildID, MaxChildren)
REFERENCES Children (ChildID, MaxChildren)
ON DELETE CASCADE
ON UPDATE CASCADE,
OccurrenceNumber INTEGER NOT NULL,
CHECK (OccurrenceNumber BETWEEN 1 AND MaxChildren),
UNIQUE (ChildID)
);
CREATE VIEW AllChildren
AS
SELECT ChildID, 1 AS ENABLED
FROM EnabledChildren
UNION
SELECT ChildID, 0 AS ENABLED
FROM Children
EXCEPT
SELECT ChildID, 0 AS ENABLED
FROM EnabledChildren;