我想使用powerbuilder中的一些数据对表进行一些插入。在使用SQL序列增加最后一个已知ID时,我有点迷失。
我知道如何找到最大ID,但是如何使用序列来确保每个新INSERT都将ID递增1?
到目前为止,我所拥有的是如何找到我的最大ID:
SELECT MAX(id)
FROM table_name;
修改 我正在使用Oracle作为我的数据库
感谢。
答案 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;