我想使用 powerbuilder 中的一些数据向表中插入一些内容。当谈到使用 SQL 序列来增加最后一个已知的 ID 时,我有点迷茫。
我知道如何找到最大 ID,但是如何使用序列来确保每个新的 INSERT 都会将 ID 增加 1?
到目前为止,我所拥有的只是如何找到我的最大 ID:
SELECT MAX(id)
FROM table_name;
编辑 我正在为我的数据库使用 Oracle
谢谢。
我想使用 powerbuilder 中的一些数据向表中插入一些内容。当谈到使用 SQL 序列来增加最后一个已知的 ID 时,我有点迷茫。
我知道如何找到最大 ID,但是如何使用序列来确保每个新的 INSERT 都会将 ID 增加 1?
到目前为止,我所拥有的只是如何找到我的最大 ID:
SELECT MAX(id)
FROM table_name;
编辑 我正在为我的数据库使用 Oracle
谢谢。
如果要向其中插入数据的表的 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;
在 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;
/
这就是应该如何使用序列。
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 ...
。你是这样做的吗?