2016-07-05 38 views
0

我試圖更新一列,但我需要檢查新值不應該在表中存在。基於某種原因,我無法在該列上創建一個唯一索引。那麼我怎麼能通過查詢處理呢?我怎樣才能像列一樣行爲而不需要索引?

UPDATE mytable SET col = :val WHERE id = :id; 

那麼我怎麼能檢查:val不會在col列在更新之前存在嗎?

+0

「基於某些原因,我不能創建在該列的唯一索引」這是可能的,因爲已經有一個你無法創建唯一索引在你的表格中重複..你檢查了嗎? –

+0

@BrianGlaz不,不,我的桌子現在是空的。我不想在該列上創建唯一索引,因爲{Long Store}':-)' – stack

+0

編寫一個觸發器來檢查新值是否存在。 – topshot

回答

1

您不能像其他SQL語言那樣執行簡單的NOT EXISTS子查詢。但是,您可以對虛擬表進行交叉連接,該虛擬表檢查val是否存在,並在虛擬表具有結果時阻止發生更新。

UPDATE mytable AS tb1 
CROSS JOIN (SELECT 1 `valExsits` FROM mytable WHERE col = :val LIMIT 1) AS tbTest 
SET tb1.col = :val 
WHERE tb1.id = :id AND tbTest.valExsits IS NULL 
+0

@Shadow,謝謝你的領導。我應該注意Sql語言。我相應地更新了我的答案。 –

+0

爲什麼'CROSSE JOIN'? – stack

+0

我想我可以做一個'LEFT JOIN',但是交叉連接更合適。通過使用交叉連接,如果虛擬表不返回一行,它不會阻止如果id匹配返回mytable的結果。如果我做了一個內部連接,並且沒有匹配會阻止更新,因爲沒有行從虛擬表中返回。 –

1

您可以使用一個不

UPDATE mytable SET col = :val WHERE id = :id 
    and not(1 = (select ifnull(max(1),0) from mytable where col = :val)) ; 
+0

@stack ..我沒有看到任何upvote .. – scaisEdge

+0

對不起,我忘了..我現在做了:-) – stack