2014-01-16 61 views
1

可能是這個問題是重複的。我檢查這個答案爲我的問題,但沒有解決我的問題。最後我的問題喜歡它。 我有一張喜歡它的人桌。 enter image description here 我想改變對方ID = 99980和ID = 99982。 ID是PK和自動增量。更改SQL中的PK值

+0

你的問題被標記爲'tsql'和'oracle',但Oracle使用PL/SQL,而不是T-SQL。 –

+1

在身份列和主鍵中不能有兩個具有相同ID的記錄。您可以更新PK字段中的值,但不應該重複。由於您嘗試的數據是重複的,因此無法實現此目的。 – Murtaza

+0

感謝賈斯汀斯基爾斯。我更新。 – Zamir10

回答

1

步驟1.重置自動遞增屬性&主鍵(把它們趕走)

步驟2.Run這些更新命令:

Update YourTableName SET ID=99982 WHERE ID=99980 

Update YourTableName SET ID=99980 WHERE FIRST_NAME='Mary' AND ID=99982 

步驟3.設定自動遞增屬性&主鍵再次打開(打開它們)。

完成

+0

我正在嘗試。 – Zamir10

+0

關閉一個關鍵(或任何其他)約束將允許它被併發事務觸發,所以在「正常」數據庫操作期間通常不建議這樣做。當你知道數據是「乾淨的」並且沒有併發的客戶端時,通常會在導入大量數據時暫時禁用約束來提高性能。 –

5

具有相同效果的另一種方法,是更新了兩個記錄之間不同的非鍵列:

UPDATE PERSON SET FIRST_NAME='Mary', Age=25 WHERE ID=99980 
UPDATE PERSON SET FIRST_NAME='John', Age=45 WHERE ID=99982 
+0

如果我只知道ID值,我該怎麼辦? – Zamir10

+0

在這種情況下,我喜歡@布蘭科的第一個建議 - http://stackoverflow.com/a/21161807/2084 –

+0

有幾個這種解決方案需要注意的地方:(1)它不會,如果有一個備用鍵工作(可能不是這裏的情況)。(2)如果使用ON UPDATE CASCADE(Oracle不支持)通過FOREIGN KEY從另一個表中引用ID,則不會觸發該引用操作(可能需要也可能不需要)。 (3)在一般情況下,您必須有額外的步驟才能真正記住這些行中的值,否則在行被覆蓋後您不會知道它們是什麼。 –

6

你的意思是你想 -change他們?

如果是這樣,你可以像這樣做:

UPDATE YOUR_TABLE 
SET ID = 
    CASE ID 
    WHEN 99980 THEN 99982 
    ELSE 99980 
    END 
WHERE ID IN (99980, 99982); 

[SQL Fiddle]

  • 這工作外的框,如果DBMS的強制約束,當SQL命令完成(Oracle和MS SQL Server)。
  • 如果DBMS在命令執行期間強制約束,並且還支持延遲約束,則可以通過推遲ID(PostgreSQL)上的密鑰來使其工作。
  • 在支持既不(MySQL的)一個DBMS,你將不得不將其使用公知的未使用的ID作爲中介,被劃分到3個的更新例如:99980 - > -1,99982 - > 99980,-1 - > 99982.