我想要一个强制一对 ID 的约束。
例如,我有一个包含两列的表。
- car_id
- 轮胎标识
但是,特定的car_id
必须始终与相同的配对tired_id
。这意味着汽车只能有一个特定的轮胎。
car_id | 轮胎标识 | other_id |
---|---|---|
1 | 1 | 1 |
2 | 2 | 2 |
3 | 8 | 3 |
4 | 3 | 4 |
1 | 1 | 5 |
3 | 8 | 6 |
1 | 9 | 7 |
在上面的示例中,所有值都是可接受的,除了(1, 9)
,因为 a car_id
of1
已经与 a 配对tire_id
。
我还添加了other_id
只是为了表明该表包含与我想要的约束无关的其他 ID。
此外,两者car_id
都有tire_id
FK 到各自的表。
请注意,我专门使用 MySQL,但我很好奇是否有针对其他 SQL 风格的特定解决方案。
编辑
我越想这个问题,我就越意识到tire
表应该与表相关,car
而这个表应该只与car
表相关,但是假设我不能更改表结构,是否有不同的解决方案?我在找?
正如您所写“但我很好奇是否有针对其他 SQL 风格的特定解决方案”
这在 Postgres 中使用排除约束是可能的
因此,第一个组合
(car_id, tire_id)
将限制所有后续组合。如果有一行带有(1,1,x)
,插入另一行带有(1,1,y)
将起作用,但插入(1,2,y)
不会。演示
注意 - 如果查询插入多于一行,并且其中至少有一个包含不正确的值,则 qhole 查询将失败并且不会插入任何行。
架构需要更改。
该表
Cars
应该有PRIMARY KEY(car_id)
另一列tire_id
,加上汽车的其他属性。该表
Tires
应具有PRIMARY KEY(tire_id)
该轮胎类型的任何属性。应该没有其他表同时包含
car_id
和tire_id
。