问题描述
考虑以下示例
- 车辆是我的超人
- 自行车和汽车是我的子类
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)
谢谢!
解决方法
有两种可能性:
-
将所有实体存储在单个表中,并使用一列(
type
左右)来确定特定行的类型。 -
使用现在拥有的布局,但向所有三个表添加一列
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');