有沒有辦法將另一個表所引用的主鍵的值更改爲外鍵?更改Oracle中的主鍵值
回答
一種更容易的替代方法是插入新行,並刪除舊的。 (在刪除之前更新其他表中的任何引用行)
如果這就是你以後沒有內置的UPDATE CASCADE。你需要做一些事情,像禁用任何FK約束;運行UPDATE語句;重新啓用約束。
請注意,更新主鍵是(通常總是)一個壞主意。
您需要在更改主鍵值之前禁用外鍵約束,然後再重新啓用它們。
如果你真正想實現「級聯更新」的功能,而不是再看看Tom Kyte's Update Cascade package
即使沒有禁用約束,如果您只想交換密鑰(這也是更改的子集,因此它可能仍然是答案對你的問題)。我寫到這裏的例子:https://stackoverflow.com/a/26584576/1900739
update MY_TABLE t1
set t1.MY_KEY = (case t1.MY_KEY = 100 then 101 else 100 end)
where t1.MYKEY in (100, 101)
是的,是有辦法做到在Oracle中級聯更新,甚至交易(不啓用/禁用限制的選項保持爲真)之內。但是,你必須自己實現它。它可以通過之前/之後行更新觸發器完成。
由於在檢查任何約束之前執行觸發器,這是可能的。 (至少在Oracle 11.2中是這樣的,沒有檢查過12.1,但我確信它沒有改變。)
無論如何,如前所述,更新主鍵通常是一個壞主意。
原則是禁用約束,根據鍵運行你的udates,並重新啓用約束。那這裏是運行禁用腳本的腳本: (假設所有約束在啓動被啓用)
生成腳本 SELECT 'alter table ' || uc.table_name|| ' disable constraint '|| uc.constraint_name|| ' ;' FROM user_constraints uc inner join user_cons_columns ucc on uc.constraint_name = ucc.constraint_name where column_name = 'MYCOLUMN_USED_AS_FOREIGN_KEY' and constraint_type='R'
複製/粘貼生成的腳本並運行它
alter table MYTABLE1 disable constraint FK_MYTABLE1 ; alter table MYTABLE2 disable constraint MYTABLE2 ; alter table MYTABLE3 disable constraint FK3_MYTABLE3 ; ...
然後更新您的PK值: update MYTABLE1 set MYFIELD= 'foo' where MYFIELD='bar'; update MYTABLE2 set MYFIELD= 'foo' where MYFIELD='bar'; update MYTABLE3 set MYFIELD= 'foo' where MYFIELD='bar'; commit;
生成啓用約束腳本:
SELECT 'alter table ' || uc.table_name|| ' enable constraint '|| uc.constraint_name|| ' ;' FROM user_constraints uc inner join user_cons_columns ucc on uc.constraint_name = ucc.constraint_name where column_name = 'MYCOLUMN_USED_AS_FOREIGN_KEY' and constraint_type='R'
另一種方法是通過更改外鍵約束,以便在您提交之前延遲約束的驗證 - 即不是通過語句驗證約束語句,而是執行事務處理,通過事務。
請注意,您無法通過「alter table」語句執行此操作,但可以刪除並重新創建外鍵約束以使其可延遲,即i。E:
alter table <table name> drop constraint <FK constraint name>;
alter table <table name> add constraint <FK constraint name> foreign key .... initially deferrable;
一旦你做到了這一點,只需更新在你喜歡的任何順序表,並提交 - 在這一點上,無論是:
- 你所有的FK約束條件都滿足了,大家的快樂;或
- 你在某處違反了FK約束 - 你會得到一個錯誤,你將不得不修複數據並提交或回滾。
請注意,此功能非常安全,因爲Oracle不允許髒讀,所以一旦提交,它們只會看到更新的效果。所以從其他會話的角度來看,參照完整性似乎得以保留。
此外,這是一次性更改,因此每次您想要更新主鍵時都不需要執行DDL。
- 1. 在oracle中更新主鍵
- 2. 更改SQL Server 2005中的主鍵值
- 3. 更改主鍵
- 4. 更改主鍵
- 5. MySQL:更改主鍵的ID
- 6. 更改表中主鍵的值和參考表中的FK
- 7. 如何更改MySQL中表的主鍵?
- 8. 如何更改grails中的主鍵列?
- 9. SQL - 如何更改主鍵
- 10. sqlite&rails:更改主鍵列?
- 11. 如何更改一對一關係中的主鍵值?
- 12. Oracle外鍵或主鍵
- 13. Oracle APEX 4.2主鍵?
- 14. SQL更改語句和外鍵/主鍵
- 15. 在SQL表中更改主鍵
- 16. 在oracle中查找表中的主鍵
- 17. 使用外鍵值的Oracle Sql更新?
- 18. 更改其他表中外鍵引用的表的主鍵列
- 19. 我想用主鍵的新值更新表的主鍵
- 20. 的Oracle APEX已更改的列值
- 21. 如何更改表的複合主鍵
- 22. 如何更改SQL Azure上的主鍵
- 23. 更改主鍵和標識的表列
- 24. 從Int到bigint的主鍵更改?
- 25. 更改主鍵,但得到的錯誤
- 26. 更改引用表上的主鍵
- 27. 更改在MySQL中具有外鍵約束的表主鍵
- 28. 當行具有相同的值時,您如何更改主鍵?
- 29. Oracle SQL主鍵卡住了
- 30. JPA2 PrimaryKey與Oracle主鍵
儘管此鏈接可能會回答問題,但最好在此處包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – 2014-10-27 10:16:05