我有一個包含2個varchar2列的表。我已經在現有的表格中添加了新的數字列來創建此列主鍵。該表現在包括3列。我嘗試使用匿名塊如下:
declare
cnt number;
begin
select nvl(count(*),0) into cnt from sometable;
for i in 1..cnt
loop
update sometable set id=i where i=rownum;
end loop;
end;
使用此匿名塊意外更新此表。
我的解決辦法是使用下面的語句:
create table sometablecopy as select row_number() over(order by sometable.col1) as id, sometable.* from sometable;
不過我珍玩爲什麼不匿名塊產生預期的與ROWNUM僞的幫助主鍵值?它必須是rownum相關的問題。將新列添加到Oracle表後生成主鍵值
0
A
回答
1
ROWNUM是一個僞列。它在從select返回時分配給行。所以你不能說「select * from my_table where rownum = 42」,因爲rownum = 42的行尚未定義,它將根據你的選擇和謂詞(和「select * from my_table where rownum = 1 「將返回一行,而不是」第一「行,無論如何)。你可以做一些類似的事情(未經測試):
declare
cursor sel_cur is
select rowid as row_id
from my_table
order by orderby_col;
v_ctr pls_integer := 0;
begin
for rec in sel_cur
loop
v_ctr := v_ctr + 1;
update my_table set pk_col = v_ctr where rowid = rec.row_id;
end loop;
commit;
exception
when others then
rollback;
raise;
end;
這假設你有足夠的回滾來更新整個表。
希望有所幫助。
1
+0
其實它太簡單了,但爲了這個任務的目的它是可以接受的:) – reforrer
+0
@reforrer:不知道你的意思。怎麼能這麼簡單? –
相關問題
- 1. 代碼生成:將主鍵/外鍵添加到實體框架
- 2. 將列表值添加到字典鍵
- 3. 將新的鍵值對添加到陣列列表
- 4. 如何將新的鍵值對添加到詞典列表?
- 5. 將主鍵添加到現有表
- 6. 將主鍵添加到現有表
- 7. Oracle如何將生成的列添加到select *
- 8. 將值添加到列表
- 9. 將列添加到Oracle OLTP表
- 10. 如何將新列添加到現有的複合主鍵
- 11. 將索引添加到生成的列
- 12. 添加更新級聯到oracle中已經存在的主鍵
- 13. 如何將主鍵添加到具有重複值的表中?
- 14. 排序列表並將排序後的值添加到bash中的新列表
- 15. 如何將列添加到MySQL InnoDB表的主鍵?
- 16. 將主鍵列添加到現有的mysqli數據庫表中
- 17. 如何將主鍵添加到視圖 - Oracle
- 18. 以Oracle序列作爲主鍵在數據綁定表格中添加新行
- 19. 將嵌套列表值添加到一個新列表
- 20. 將外鍵列添加到表中。
- 21. 添加一個新的主鍵列
- 22. 將新值添加到數據庫後立即生成電子郵件?
- 23. ruby將新的鍵值對添加到嵌套散列
- 24. 將新項目添加到列表後,ListView未更新
- 25. 在SQL表中添加主鍵列
- 26. 將主鍵列值插入到非主鍵列
- 27. 如何使用Grails將新的自動生成的主鍵字段添加到遺留表中?
- 28. 將新鍵添加到列表項中的字典時出錯
- 29. 按鍵排序詞典,然後將所有值添加到列表
- 30. 如何將變量鍵/值對添加到列表對象?
意外的結果是什麼? – StevieG
返回結果時分配Rownum。因此,你永遠不可以做一個SELECT ... WHERE rownum <1',因爲如果至少有一行,那麼第一個必須有rownum等於1. – Benoit
StevieG:所有行都有相同的主鍵值第一行。第一行有數字1,其他行有cnt變量。 – reforrer