如何强制来自两个不同表的两个PK相同的FK列是不相交的

问题描述

考虑以下示例

  • 车辆是我的超人
  • 自行车和汽车是我的子类
CREATE TABLE Vehicle (

    Vehicle_id        INT   PRIMARY KEY
    ...

);

CREATE TABLE Bike (

    Vehicle_id       INT   PRIMARY KEY REFERENCES Vehicle(Vehicle_id)
    ...

);

CREATE TABLE Car (

    Vehicle_id       INT   PRIMARY KEY REFERENCES Vehicle(Vehicle_id)
    ...

);
  • 车辆不一定要是自行车或汽车,但不能同时是自行车和汽车
  • 我一直在尝试类似的方法(如何在??中引用Bike)
ALTER TABLE ONLY Car
   ADD CONSTRAINT not_in_bike CHECK (??)
  • 或者,我可以做这样的事情吗?
ALTER TABLE Car AND Bike
    ADD CONSTRAINT Car_or_Bike CHECK (Car.Vehicle_id <> Bike.Vehicle_id)

谢谢!

解决方法

有两种可能性:

  1. 将所有实体存储在单个表中,并使用一列(type左右)来确定特定行的类型。

  2. 使用现在拥有的布局,但向所有三个表添加一列type。将该列添加到主键或在(vehicle_id,type)上创建唯一约束。

    定义外键以包含type,并使用CHECK约束确保它们具有正确的值:

    ALTER TABLE bike ADD FOREIGN KEY (vehicle_id,vehicle_type) REFERENCES vehicle;
    
    ALTER TABLE bike ADD CHECK (vehicle_type = 'bike');