2012-07-13 71 views
2

我有一個表中的應用,其目前的架構是:涉及多個列的MySQL限制

CREATE TABLE quotes 
(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    quote_request_id INT UNSIGNED NOT NULL, 
    quote_amount DECIMAL(12, 2) NOT NULL, 
    accepted TINYINT UNSIGNED NOT NULL DEFAULT 0, 
    FOREIGN KEY (quote_request_id) REFERENCES quote_requests(id) 
) Engine=InnoDB; 

我要強制執行,使得只有一個報價可以針對給定的報價請求被接受的約束 - 即如果UPDATE或INSERT查詢嘗試修改表,使得具有相同quote_request_id值的兩行或更多行的值將爲accepted,則UPDATE或INSERT查詢應失敗。

這在MySQL中可能嗎?強制約束如外鍵,除主鍵以外的列的唯一性等工作正常,我可以找到有關將UNIQUE約束應用於多個列的信息,但我找不到有關涉及多個列的更復雜約束的任何信息。

+0

我不認爲這有可能在MySQL中不恢復到觸發器,因爲MySQL不支持部分索引。 – 2012-07-13 09:55:03

+0

嗯,這是相當令人沮喪,雖然有用的知道。你能否重新發表你的評論作爲答案,以便我可以接受它?謝謝。 – pwaring 2012-07-16 09:37:57

回答

0

通過a_horse_with_no_name回答,但在評論所以它不能被接受:

「我不認爲這是可能沒有恢復到MySQL中的觸發器,因爲MySQL不支持部分索引。」

0

你的意思是你想UNIQUE這樣的:

UNIQUE `quote_accepts` (`quote_request_id`, `accepted`) 

其中,對於重複對quote_request_id & accepted,該INSERT將失敗。

+0

不完全是這樣,因爲只允許爲同一個報價請求輸入最多兩個報價(其中'accepted = 0'和另一個'accepted = 1'),而我不想設置限制「accepted = 0」的引號數量。 – pwaring 2012-07-13 08:48:41

1

如果你想做到這一點沒有觸發,你可以添加其他表,其中只接受報價將被保存 - 你可以從quotes表中刪除accepted柱:

CREATE TABLE quotes 
(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    quote_request_id INT UNSIGNED NOT NULL, 
    quote_amount DECIMAL(12, 2) NOT NULL, 
    --- accepted TINYINT UNSIGNED NOT NULL DEFAULT 0,    --- removed 
    FOREIGN KEY (quote_request_id) REFERENCES quote_requests(id) 
    UNIQUE KEY (quote_request_id, id)    --- needed for the FK below 
) Engine=InnoDB; 

CREATE TABLE quotes_accepted 
(
    id INT UNSIGNED NOT NULL PRIMARY KEY, 
    quote_request_id INT UNSIGNED NOT NULL, 
    UNIQUE KEY (quote_request_id),   --- this ensures there is only one 
              --- accepted quote per request 
    FOREIGN KEY (quote_request_id, id) 
    REFERENCES quotes(quote_request_id, id) 
) Engine=InnoDB; 
+0

這是行得通的,但我認爲額外架構的權衡和其成本可能超過了在數據庫中擁有約束的好處。 我也嘗試使用CHECK選項,但顯然MySQL接受它(即它是有效的語法),但忽略它。 – pwaring 2012-07-23 13:45:12