如何强制两个不同表中的两个(PK 相同 FK)列不相交

How to enforce that two (PK same FK) columns from two different tables are disjoint

考虑以下示例

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)
    ...

);
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. 将所有实体存储在一个 table 中,并使用列(type 左右)来确定特定行的类型。

  2. 使用您现在的布局,但向所有三个 table 添加一列 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');