在Oracle中将行计数传递给列

在Oracle中将行计数传递给列,oracle,Oracle,我有一个没有ID的表。所以我想添加一个新的列,它是总行数的1。我在表中打开了一个新列,但我不知道如何用行数填充它。我在网上搜索了一下,但找不到解决问题的方法。你能告诉我怎么做吗?提前感谢。最简单的解决方案是 update your_table set id = rownum; 但是,这对以后插入此表没有帮助。如果这是将要发生的事情,构建一个序列 SQL> select max(id) from your_table; MAX(ID) ---------- SQL> cr

我有一个没有ID的表。所以我想添加一个新的列,它是总行数的1。我在表中打开了一个新列,但我不知道如何用行数填充它。我在网上搜索了一下,但找不到解决问题的方法。你能告诉我怎么做吗?提前感谢。

最简单的解决方案是

update your_table
set id = rownum;
但是,这对以后插入此表没有帮助。如果这是将要发生的事情,构建一个序列

SQL> select max(id) from your_table;

   MAX(ID)
----------


SQL> create sequence your_table_seq;

Sequence created.

SQL> update your_table
  2  set id = your_table_seq.nextval;

30 rows updated.

SQL> select max(id) from your_table;

   MAX(ID)
----------
        30

SQL> select id from your_table;

        ID
----------
         1
         2
         3
....
        28
        29
        30

30 rows selected.

SQL> 

顺便说一下,现在您已经添加了一个ID列并填充了它,请确保将其作为主键执行:

alter table your_table add constraint your_table_pk primary key (id);
您可以这样做(适用于12c或更高版本):

不过,这也会为列生成新值,以便将来插入


关于
total row number
,这几乎总是会生成从1到“total row number”的值,但无论如何(不知道确切的时间,这可能会不正确),为了检查这一点,在
alter
之后,您可以执行以下操作:
从您的\u表中选择count(*)、max(id)
。值应该匹配在一起。

您希望以什么顺序生成此id列?您可以使用序列,如果它只需要是唯一的(而不一定是无间隙的)。您也可以在查询时使用
row\u number
而不是存储值。此解决方案仅适用于版本12c或更高版本。@APC-谢谢,您是正确的,更新如果OP使用12c,这将是最好的解决方案
alter table your_table add id number generated always as identity;