Mysql
強制一對 ID 的約束
我想要一個強制一對 ID 的約束。
例如,我有一個包含兩列的表。
- car_id
- 輪胎標識
但是,特定的
car_id
必須始終與相同的配對tired_id
。這意味著汽車只能有一個特定的輪胎。在上面的範例中,所有值都是可接受的,除了
(1, 9)
,因為 acar_id
of1
已經與 a 配對tire_id
。我還添加了
other_id
只是為了表明該表包含與我想要的約束無關的其他 ID。此外,兩者
car_id
都有tire_id
FK 到各自的表。請注意,我專門使用 MySQL,但我很好奇是否有針對其他 SQL 風格的特定解決方案。
編輯
我越想這個問題,我就越意識到
tire
表應該與表相關,car
而這個表應該只與car
表相關,但是假設我不能更改表結構,是否有不同的解決方案?我在找?
CREATE TRIGGER tr_cars_custom_constraint BEFORE INSERT ON cars FOR EACH ROW BEGIN IF EXISTS ( SELECT NULL FROM cars WHERE car_id = NEW.car_id AND tire_id <> NEW.tire_id ) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Another tire is registered for this car already!'; END IF; END
注意 - 如果查詢插入多於一行,並且其中至少有一個包含不正確的值,則 qhole 查詢將失敗並且不會插入任何行。
正如您所寫“但我很好奇是否有針對其他 SQL 風格的特定解決方案”
這在 Postgres 中使用排除約束是可能的
alter table tires add constraint single_tire exclude using gist (car_id with =, tire_id with <>);
因此,第一個組合
(car_id, tire_id)
將限制所有後續組合。如果有一行帶有(1,1,x)
,插入另一行帶有(1,1,y)
將起作用,但插入(1,2,y)
不會。