如何强制两个不同表中的两个(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)
谢谢!
有两种可能:
将所有实体存储在一个 table 中,并使用列(type
左右)来确定特定行的类型。
使用您现在的布局,但向所有三个 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');
考虑以下示例
- 车辆是我的超类
- 自行车和汽车是我的子类
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)
谢谢!
有两种可能:
将所有实体存储在一个 table 中,并使用列(
type
左右)来确定特定行的类型。使用您现在的布局,但向所有三个 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');