基于值子集的约束,该值子集取决于PostgreSQL中另一列的值

rdlzhqv9  于 2023-05-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(105)

在PostgreSQL中,我有一个“汽车”表(id,model,color)我如何根据模型约束输入颜色?例如:

  • 如果是AA型号,则颜色必须为蓝色、红色或黑色
  • 如果是BB型号,则颜色必须为蓝色、灰色或黑色

是否可以依赖于基于模型过滤的颜色的全局列表,而不是使用具有硬编码颜色的约束中的条件?谢谢你的帮助

mrwjdhj3

mrwjdhj31#

我不确定我理解这个问题,但假设:

CREATE TABLE model_colors
( model TEXT NOT NULL
, color TEXT NOT NULL
, PRIMARY KEY (model, color)
);

INSERT INTO model_colors (model, color)
VALUES ('AA', 'blue'), ('AA', 'red'), ...

在汽车表中:

CREATE TABLE cars
( ...
, model TEXT NOT NULL
, color TEXT NOT NULL
, ...
, FOREIGN KEY (model, color) REFERENCES model_colors (model, color)
);

现在,您只能拥有model_colors中存在model/color的汽车。

w7t8yxp5

w7t8yxp52#

只要有一张表记录下来就行了

CREATE TABLE cars (
    car_id     int
  , car_model  something FOREIGN KEY REFERENCES car_models
  , car_colour something FOREIGN KEY REFERENCES car_colours
  etc

  CONSTRAINT valid_model_colour FOREIGN KEY (car_model, car_colour) REFERENCES model_colour_combos
);

CREATE TABLE model_colour_combos (
    car_model  something FOREIGN KEY REFERENCES car_models
  , car_colour something FOREIGN KEY REFERENCES car_colours
  , PRIMARY KEY (car_model, car_colour)
);

INSERT INTO model_colour_combos VALUES
    ('AA', 'blue')
  , ('AA', 'red')
  , ('AA', 'black')
  , ('BB', 'blue')
  , ('BB', 'grey')
  , ('BB', 'black')
;

相关问题