星期四, 2月 09, 2012

[Java] Insert if not exist: 資料列不存在時才新增


重覆的連絡人清單就不要插入!!
重點在select * from (select 2,'ken') as tmpInsert記得要重新給一個別名,
不然編譯都會爆炸給你看lol

範例:
插入一個使用者ken到聯絡人清單索引為2的結果

insert into contact_list_member(contact_list_id,uid)
select * from (select 2,'ken') as tmpInsert
where not exists(select 1 from contact_list_member clm where clm .contact_list_id= 2 and  clm .uid='ken')


使用preparedstatement就會像下面那樣
//insert if not exist
   String insertMemberSql= 
    "insert into contact_list_member(contact_list_id,uid) select * from (select ?,?) as tmpInsert where not exists(select * from contact_list_member where contact_list_id=? and uid=?)";

Update 2012/03/08 今天在同事的測試下發現上面的語句在插入的值都一樣的時候所產生的duplicate column name bug,簡單的用新增使用者的範例來記綠一下 

範例:
以下語句要新增一個帳號跟密碼都是叫cindy,不一樣就不會有這個問題!!

insert into users(account,password) select* from (select 'cindy','cindy') as tmpInsert where not exists(select 1 from users where account = 'cindy')

 問題: 錯誤的原因在於我們要建立一個帳號跟密碼一樣的使用者,會造成表格出現重覆欄位名稱的問題(Duplicate column name 'cindy'錯誤)

 以下是產生這個錯誤的SQL片段

select* from (select 'cindy','cindy') as tmpInsert 解法

因tmpInsert已經含有重覆的column name了,因此我們需要指定tmpInsert內的column name,才不會讓表格內的欄位名稱重覆的異常

 select account ,password from (select 'cindy' as account ,'cindy' as password) as tmpInsert

上述語句會產生的tmpInsert資料表結果集

account  |  password
cindy     |  cindy

Reference: MySQL一個聰明的sql,當Record沒有的時候才增加
不存在时才插入数据

沒有留言:

張貼留言

留個話吧:)