為簡單起見,假設有兩個表A和B,分別在非鍵 INT 列COLUMN_A和上具有唯一索引COLUMN_B。我想做類似下面的偽SQL。(請注意,這將在存盤程序中,但根據https://mariadb.com/kb/en/lock-tables/,這是不允許的。)
IF COLUMN_A != x for all rows of A
Single query to insert a row into B with COLUMN_B = x (if not exist)
問題是代碼的其他部分可以讀取Aand B,看到x兩者都不存在,并嘗試在陳述句和插入查詢x之間A插入。IF競爭條件似乎需要對A. 我不認為 InnoDB 的內部鎖定會阻止這種情況發生(即IF陳述句期間使用的任何鎖定都將在執行插入之前釋放)。
至關重要的是,COLUMN_A 和 COLUMN_B 在形式上是不相關的,因此似乎沒有一種直接的方法可以在它們之間強制執行唯一性約束(假設同時涉及 A 和 B 的視圖可能無法更新)。(只要它們保留在單獨的表中,我會很好地在它們之間創建某種“關系”,但我不確定是否有任何東西可以做到這一點。)是否有必要在 A 上設定表鎖案子?
這樣的事情似乎是一個更好的解決方案:我可以在尚未創建的行上使用行鎖嗎?但是這個問題是關于 Postgres 的,并且這些功能在 MySQL 中似乎不可用。
謝謝你。
uj5u.com熱心網友回復:
將條件放入INSERT陳述句而不是使用IF陳述句。
INSERT INTO B (col1, col2, col3, ...)
SELECT val1, val2, val3, ...
FROM DUAL
WHERE NOT EXISTS (
SELECT *
FROM A
WHERE column_a = 'x'
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522183.html
