2014-10-02 78 views
0

我正在處理用戶表並將userName字段更改爲userName ||'test'不幸的是,在這個方法的某個地方,已經有轉換的userNames等於這個已經。由於userName具有唯一的約束,我需要一種方法來更新這些字段,除非它們會導致重複。我一直在網上尋找幫助,到目前爲止只發現了一個通用的「讓你的更新不會導致重複」,沒有更多的關於如何與oracle做到這一點。oracle sql-update除非更新將重複在唯一

表: 主要VARCHAR獨特VARCHAR USER_ID名username

需要更新所有的用戶名至USERNAME =用戶名|| 'test',除非userName ||'test'已經存在。

有什麼建議嗎?

+0

如果'userName ||'test''已經存在,你會怎麼做 - 使用不同的模式,或者保留原來的'userName'?你看過'不存在'測試嗎? – 2014-10-02 16:08:32

+0

如果userName ||'test'已經存在,它應該將其更改爲userName ||'duplicate',這樣我就可以返回並在清理前手動檢查。 – lessawarren 2014-10-02 19:44:32

+0

如果你要手動清理,那麼你可以使用guildbounty的答案;然後運行後,查找'用戶名不像'%test''而不是'like'%duplicate''的地方。 – 2014-10-02 19:47:57

回答

1

假設用戶名是目前不同了,有沒有預先存在的重複處理...

UPDATE UserTable ut1 
SET userName = userName || 'test' 
WHERE NOT EXISTS(
    SELECT 1 
    FROM UserTable ut2 
    WHERE ut2.userName LIKE ut1.userName || 'test' 
) 

有關NOT EXISTS子句,我會添加一個警示性聲明。它可以非常迅速地進入可怕的表現領域。這很有用,但應謹慎使用。

+0

我給了這個嘗試,它仍然導致ORA-00001唯一約束錯誤。我用.. UPDATE用戶 SET的userName =用戶名|| '測試' WHERE NOT EXISTS(SELECT FROM用戶U2 其中username類似於username || '測試' ) 和用戶名NOT LIKE '%測試' ; – lessawarren 2014-10-02 19:49:52

+0

用戶名是主鍵嗎?我無法真正解讀你在那裏的表格描述。如果是這樣,我可以想到兩個可能的選擇,可能仍然會給你帶來麻煩。 – guildsbounty 2014-10-02 19:52:30

+0

user_id是主鍵。對不起,還不熟悉堆棧的格式。顯然,一個艱難的輸入不等於換行符。 – lessawarren 2014-10-02 19:53:38