Mysql

強制一對 ID 的約束

  • March 4, 2022

我想要一個強制一對 ID 的約束。

例如,我有一個包含兩列的表。

  1. car_id
  2. 輪胎標識

但是,特定的car_id必須始終與相同的配對tired_id。這意味著汽車只能有一個特定的輪胎。

在上面的範例中,所有值都是可接受的,除了(1, 9),因為 a car_idof1已經與 a 配對tire_id

我還添加了other_id只是為了表明該表包含與我想要的約束無關的其他 ID。

此外,兩者car_id都有tire_idFK 到各自的表。

請注意,我專門使用 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)不會。

引用自:https://dba.stackexchange.com/questions/308236