我有一個包含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. Oracle如何將生成的列添加到select *
- 7. 將主鍵添加到現有表
- 8. 將主鍵添加到現有表
- 9. 將值添加到列表
- 10. 將列添加到Oracle OLTP表
- 11. 阻止更新生成主鍵列
- 12. 無法將新列添加到現有主鍵
- 13. 如何將新列添加到現有的複合主鍵
- 14. 將值添加到表格並將其添加到主窗體
- 15. 將索引添加到生成的列
- 16. 添加更新級聯到oracle中已經存在的主鍵
- 17. 如何主鍵列的值添加到其他表
- 18. 將主鍵添加到由查詢結果創建的新表
- 19. 如何將主鍵添加到具有重複值的表中?
- 20. 如何將列添加到MySQL InnoDB表的主鍵?
- 21. 將主鍵列添加到現有的mysqli數據庫表中
- 22. 如何將主鍵添加到視圖 - Oracle
- 23. 排序列表並將排序後的值添加到bash中的新列表
- 24. 以Oracle序列作爲主鍵在數據綁定表格中添加新行
- 25. 如何在表中添加列,然後將其轉換爲主鍵列並在SQL上添加值?
- 26. 將嵌套列表值添加到一個新列表
- 27. 添加一個新的主鍵列
- 28. 將外鍵列添加到表中。
- 29. 將新值添加到數據庫後立即生成電子郵件?
- 30. ruby將新的鍵值對添加到嵌套散列
意外的結果是什麼? – StevieG
返回結果時分配Rownum。因此,你永遠不可以做一個SELECT ... WHERE rownum <1',因爲如果至少有一行,那麼第一個必須有rownum等於1. – Benoit
StevieG:所有行都有相同的主鍵值第一行。第一行有數字1,其他行有cnt變量。 – reforrer