具有来自不同表格的多个列的外键
我们举一个愚蠢的例子:我有很多家养的动物,每个动物都有一个名字作为ID和一个类型(CAT或DOG),让我们这样写( 伪代码 ):
TABLE ANIMALS (
NAME char,
ANIMAL_TYPE char {'DOG', 'CAT'}
PRIMARY KEY(NAME)
)
(例如,我有一只名叫费利克斯的猫,一只叫冥王星的狗)
在另一张桌子上,我想为我的每一只动物储存首选食物:
TABLE PREFERED_FOOD (
ANIMAL_NAME char,
PREF_FOOD char
FOREIGN KEY (ANIMAL_NAME) REFERENCES ANIMALS(NAME)
)
(例如,菲利克斯喜欢牛奶,冥王星喜欢骨头)
正如我想定义一组可能喜欢的食物,我在第三张表中存储了每种类型动物的食物类型:
TABLE FOOD (
ANIMAL_TYPE char {'DOG', 'CAT'},
FOOD_TYPE char
)
(例如,DOG吃骨头和肉,CAT吃鱼和牛奶)
在这里我的问题是:我想补充一个外国约束在PREFERED_FOOD,从而将PREF_FOOD是从FOOD.ANIMAL_TYPE = ANIMALS.TYPE食品FOOD_TYPE。 如何在不重复PREFERED_FOOD上的ANIMAL_TYPE的情况下定义此外键?
我不是SQL的专家,所以如果它真的很简单,你可以称我为傻瓜;-)
你不能在SQL中。 我想你可以如果SQL支持断言。 (SQL-92标准定义的断言,据我所知,尚无人支持它们。)
要解决该问题,请使用重叠约束。
-- Nothing special here.
create table animal_types (
animal_type varchar(15) primary key
);
create table animals (
name varchar(15) primary key,
animal_type varchar(15) not null references animal_types (animal_type),
-- This constraint lets us work around SQL's lack of assertions in this case.
unique (name, animal_type)
);
-- Nothing special here.
create table animal_food_types (
animal_type varchar(15) not null references animal_types (animal_type),
food_type varchar(15) not null,
primary key (animal_type, food_type)
);
-- Overlapping foreign key constraints.
create table animals_preferred_food (
animal_name varchar(15) not null,
-- This column is necessary to implement your requirement.
animal_type varchar(15) not null,
pref_food varchar(10) not null,
primary key (animal_name, pref_food),
-- This foreign key constraint requires a unique constraint on these
-- two columns in "animals".
foreign key (animal_name, animal_type)
references animals (animal_name, animal_type),
-- Since the animal_type column is now in this table, this constraint
-- is simple.
foreign key (animal_type, pref_food)
references animal_food_types (animal_type, food_type)
);
FOREIGN KEY (PREF_FOOD) REFERENCES FOOD (FOOD_TYPE)
在PREFERRED_FOOD表中,这将确保PREFERRED_FOOD表中的每个PREFFOOD已经存在于FOOD表的FOOD_TYPE中。
并在FOOD表格中使用,现在已经很明显了。
FOREIGN KEY (ANIMAL_TYPE) REFERENCES ANIMALS (ANIMAL_TYPE)
根据您所使用的DBMS(请编辑您的问题,包括这一点),你可能会想创建的唯一约束ANIMAL_TYPE
和PREFERED_FOOD
列。
像这样的东西:
ALTER TABLE PREFERED_FOOD
ADD CONSTRAINT uc_FoodAnimal UNIQUE (ANIMAL_TYPE,PREFERED_FOOD)
链接地址: http://www.djcxy.com/p/11211.html
上一篇: Foreign key with multiple columns from different tables
下一篇: How to implement multiple columns table with jquery mobile?