2014-09-22 89 views
-1

我需要做一個多重插入語句,我需要防止重複行而不使用主鍵或任何其他唯一索引。要插入的行需要檢查兩個(或更多)列是否相等,如果所有列至少與表中的一行匹配,則阻止插入。理想的解決方案是隻使用一個MySQL插入語句。MySQL - 防止重複的多個插入語句,而不使用唯一的索引

例如,有一個行已經插入表:

INSERT INTO `table1` (`a`, `b`, `c`) 
    VALUES ('1', '2', 'foo'); 

這是一個仍需要插入的數據:

INSERT INTO `table1` (`a`, `b`, `c`) 
    VALUES ('A', 'B', 'C'), ('1', '2', 'bar'), ('D', 'E', 'F'); 

你如何檢查列a和b ('A','B','C')和('D','E','F')同時插入('1','2','bar')插入嗎?

+0

不(1,3,吧)碰撞(1,2,富)?怎麼樣(2,2,酒吧)?您用於確定重複行的準確條件是什麼? – 2014-09-22 16:40:27

+0

詢問如何在不使用索引的情況下防止RDMS中的重複行有點像是說:「我需要將我的車開到紐約,它有一個爆胎,我不想修理它,所以什麼是最好的如果我在我的車輪上開車,去紐約的路線?「 – 2014-09-22 16:42:15

+0

@Ollie Jones我完全同意。我現在唯一的解決方案是在列上創建唯一的索引,並在插入中使用'ON DUPLICATE KEY'。我的問題是,我無法確認這些列是否應始終是唯一的,因爲其數據/代碼我沒有自己寫。 – Siphon 2014-09-22 16:50:00

回答

1

您可以使用insert . . . select

INSERT INTO `table1` (`a`, `b`, `c`) 
    select t.* 
    from (select 'a' as a, 'b' as b, 'c' as c union all 
      select '1', '2', 'bar' union all 
      select 'd', 'e', 'f' 
     ) t 
    where not exists (select 1 from table1 t1 where t1.a = t.a and t1.b = t.b); 
+0

這有點凌亂,但這正是我所期待的。謝謝! – Siphon 2014-09-22 17:36:50

0

唯一的方法是檢查與該值的行的存在。 這是更好地創建一個主鍵,這樣就可以使用INSERT忽略

if not exists (select * from table1 where a = '1' and b ='2' and c ='bar') 
    insert into table1 ('1','2', 'bar') 
+0

'IF NOT EXIST'是我一直在尋找的東西。該語法如何轉換爲多插入語句。 – Siphon 2014-09-22 17:03:57