具有来自不同表格的多个列的外键

我们举一个愚蠢的例子:我有很多家养的动物,每个动物都有一个名字作为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_TYPEPREFERED_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?