【发布时间】:2012-09-02 16:23:35
【问题描述】:
我有 3 张桌子:
CREATE TABLE "Names" (
"Name" TEXT(20) NOT NULL,
"Gender" TEXT(20) NOT NULL,
PRIMARY KEY ("Name", "Gender")
);
CREATE TABLE "Snames" (
"Sname" TEXT(20) NOT NULL,
PRIMARY KEY ("Sname")
);
CREATE TABLE "People" (
"ID" INTEGER NOT NULL,
"Name" TEXT(20) NOT NULL,
"Sname" TEXT(20) NOT NULL,
"Gender" TEXT(1) NOT NULL,
"FatherID" INTEGER,
"MotherID" INTEGER,
PRIMARY KEY ("ID") ,
CONSTRAINT "Father" FOREIGN KEY ("FatherID") REFERENCES "People" ("ID"),
CONSTRAINT "Mother" FOREIGN KEY ("MotherID") REFERENCES "People" ("ID"),
CONSTRAINT "Sname" FOREIGN KEY ("Sname") REFERENCES "Snames" ("Sname"),
CONSTRAINT "Name" FOREIGN KEY ("Name", "Gender") REFERENCES "Names" ("Name", "Gender")
);
我的问题是“FatherID”和“MotherID”的外键约束,它们引用了它们自己的表。是否可以只允许在“FatherID”的“性别”列中的“M”和“MotherID”的“F”中的外键?是否可以禁止母亲/父亲引用同一行?
基本上:父亲必须是男性。妈妈一定是女性。你不能做你自己的母亲/父亲。
【问题讨论】:
-
为什么这三个表是分开的?
-
如果一个人有两个相同性别的父母怎么办;)
-
我不知道 sqllite,但想象
CHECK ("ID" NOT IN ("FatherID", "MotherID"))应该做最后一点(你不能成为你自己的母亲/父亲)。 -
@Ashley,由于您正在使用自己的名字查找姓氏,因此将其提取到自己的表中并没有真正获得任何好处。
-
@Arkain:您可以将 people.sname 中的值限制为 snames.sname 中的值。
标签: sql database sqlite foreign-keys constraints