将MAX(id)分配给Sequence

时间:2012-09-24 13:36:03

标签: sql oracle powerbuilder

我想使用powerbuilder中的一些数据对表进行一些插入。在使用SQL序列增加最后一个已知ID时,我有点迷失。

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

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

SELECT MAX(id)
FROM table_name;

修改 我正在使用Oracle作为我的数据库

感谢。

3 个答案:

答案 0 :(得分:2)

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

示例:

select my_sequence.nextval from dual;

当您导入数据时,让我们说已经用完了10000个ID,您可以改变序列以增加该数字。由于这是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;
/

答案 1 :(得分: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 ...。你是这样做的吗?

答案 2 :(得分:2)

如果要插入数据的表的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]);

OR

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;