2

我想使用 powerbuilder 中的一些数据向表中插入一些内容。当谈到使用 SQL 序列来增加最后一个已知的 ID 时,我有点迷茫。

我知道如何找到最大 ID,但是如何使用序列来确保每个新的 INSERT 都会将 ID 增加 1?

到目前为止,我所拥有的只是如何找到我的最大 ID:

SELECT MAX(id)
FROM table_name;

编辑 我正在为我的数据库使用 Oracle

谢谢。

4

3 回答 3

3

如果要向其中插入数据的表的 ID 值来自模式序列中已经存在的值,那么欢迎您继续使用该序列插入新记录。

如果您想创建一个新序列,该序列将从表列的最大值开始生成数字,ID那么您可以执行以下操作

创建序列:

create sequence Seq_Name;

更改值序列将从

declare
  l_max_ID number;
  l_Temp_val number;
begin
  select max(ID) into l_max_ID
    from your_table;

  execute immediate 'alter sequence Seq_Name increment by ' || To_Char(l_Max_ID);

  select Seq_Name.currval into l_temp_val
    from dual;

  execute immediate 'alter sequence Seq_Name increment by ' || To_Char(1);
end; 

并使用下面列出的任何方法来获取序列的下一个值。

Insert into your_table(id, [other_columns])
  values(Seq_name.nextval, [other_values]);

或者

create or replace trigger Tr_Name before insert on Your_Table_name
for each row
begin
  -- if you are using oracle prior to 11g then 
  select Seq_name.nextval into :new.id -- or any other column
    from dual;
  --     OR
  -- if your Oracle version is 11g onward you can simply assign 
  -- sequence's value to a new ID
  :new.id := Seq_Name.nextval;

end;
于 2012-09-24T14:15:57.493 回答
2

在 oracle 中,要获取序列中的下一个值,请使用 .nextval。

例子 :

select my_sequence.nextval from dual;

当您导入数据并且假设 10000 之前的 ids 已经用完时,您可以更改您的序列以增加该数字。由于这是 DDL,您可能必须使用动态 SQL。

declare
  l_current_max_value number;
  l_dummy number
begin
  select max(id)
    into l_current_max_value 
    from my_table;

  for i in 1..l_current_max_value loop
    l_dummy := l_current_max_value.nextval; --bouncing the sequence, 
                                            --another option is to recreate it.
  end loop; 

end;
/

注意:这是假设您当前的序列根本没有使用。如果您要将数据导入到现有的包含数据的表中,那么沿着相同的路线进行更多的工作,您需要考虑两个表中的公共 ID。

编辑:“我如何将 current_max_number 分配给 my_sequence”

完成所有导入后,您可以使用 .nextval 获取 id。例如。

create or replace procedure new_product(
  i_sku in number,
  i_name in varchar2(100)
)
as
begin
  insert into new_product (id, sku, name)
  values (product_seq.nextval, i_sku, i_name);

  commit;
end;
/

或者您可以将其放入变量中以进行任何进一步处理..

declare
 l_next_id number;
begin
 select my_sequence.nextval
   into l_next_id
   from dual;
 --further processing
end;
/
于 2012-09-24T14:08:49.607 回答
2

这就是应该如何使用序列。

22:05:18 HR@vm_xe> create table test_seq_tab(a number, b number);                                            

Table created.                                                                                               

Elapsed: 00:00:00.85                                                                                         
22:05:43 HR@vm_xe> create sequence test_seq start with 1 increment by 1;                                     

Sequence created.                                                                                            

Elapsed: 00:00:00.12                                                                                         
22:06:33 HR@vm_xe> insert into test_seq_tab select test_seq.nextval, rownum from dual connect by level <= 10;

10 rows created.                                                                                             

Elapsed: 00:00:00.11                                                                                         
22:06:40 HR@vm_xe> select * from test_seq_tab;                                                               

         A          B                                                                                        
---------- ----------                                                                                        
         1          1                                                                                        
         2          2                                                                                        
         3          3                                                                                        
         4          4                                                                                        
         5          5                                                                                        
         6          6                                                                                        
         7          7                                                                                        
         8          8                                                                                        
         9          9                                                                                        
        10         10                                                                                        

10 rows selected.                                                                                            

Elapsed: 00:00:00.10                                                                                         
22:06:50 HR@vm_xe> select test_seq.currval from dual;                                                        

   CURRVAL                                                                                                   
----------                                                                                                   
        10                                                                                                   

1 row selected.                                                                                              

Elapsed: 00:00:00.01                                                                                         
22:07:04 HR@vm_xe>                                                                                           

不需要select max ...。你是这样做的吗?

于 2012-09-24T14:09:31.053 回答