SQL中的自动增量主键

时间:2019-08-02 01:49:55

标签: sql oracle primary-key oracle12c auto-increment

我需要有关数据库中大量表的插入语句的帮助。 SQL新手-只是基本了解

摘要:

表1

Col1 Col2   Col3
1    value1 value1 
2    value2 value2
3    value3 value3

表2

Col1 Col2   Col3
4    value1 value1 
5    value2 value2
6    value3 value3

当用户从GUI创建静态数据记录时,多个表使用相同顺序的自动生成的主键。

但是,我正在寻找创建脚本以将静态数据从一种环境上传到另一种环境。

其中一个表的示例:

Insert into RULE (PK_RULE,NAME,RULEID,DESCRIPTION) 
values 
(4484319,'TESTRULE',14,'TEST RULE DESCRIPTION')

我如何设计我的插入语句,以便它从PK列(此处为4484319)读取最后一个值,并自动插入4484320而没有明确提及?

注意:我们的数据库有成千上万的记录。

我认为有些类似于(SELECT MAX(ID) + 1 FROM MyTable)的东西可以潜在地解决我的问题,但我不知道如何使用它。

2 个答案:

答案 0 :(得分:2)

  

当用户从GUI创建静态数据记录时,多个表使用相同顺序的自动生成的主键。

通常,多个表共享一个主键序列是一个糟糕的设计选择。每个表的主键只需要是唯一的。 。如果它们需要在全球范围内唯一,则可以使用更好的选择,例如UUID primary keys

相反,给每个表各自独立的主键序列。在MySQL中,它是id bigint auto_increment primary key。在Postgres中,您将使用bigserial。在Oracle 12c中为number generated as identity

matplotlib

然后将它们插入到每个字段中,而不使用create table users ( id number generated as identity, name text not null ); create table things ( id number generated as identity, description text not null ); 或将其设置为null。数据库将从每个序列中填充它。

id

如果未使用自动递增的顺序主键设置模式,则可以更改模式以使用它们。只需确保将每个序列设置为最大ID +1。从长远来看,这是迄今为止最明智的选择。

如果确实必须从单一来源获取所有主键,请create a sequence并使用它。

insert into users (name) values ('Yarrow Hock');              -- id 1
insert into users (id, name) values (null, 'Reaneu Keeves');  -- id 2

insert into things (description) values ('Some thing');            -- id 1
insert into things (id, description) values (null, 'Shiny stuff'); -- id 2

然后使用nextval获取下一个密钥。

create sequence master_seq
  start with ...

这样的序列增加到1,000,000,000,000,000,000,000,000,000,000,000,应该足够了。

答案 1 :(得分:1)

Oracle中的INSERT和UPDATE语句上有一个...RETURNING...INTO...子句,可用于返回刚插入的值。与触发和序列生成的主键(Oracle 11及更早版本)或标识列(Oracle 12及更高版本)结合使用时,您可以取回最近插入/更新的值。

例如,假设您有一个表TABLE1定义为

CREATE TABLE TABLE1 (ID1   NUMBER
                       GENERATED ALWAYS AS IDENTITY
                       PRIMARY KEY,
                     COL2  NUMBER,
                     COL3  VARCHAR2(20));

然后定义一个函数,该函数将数据插入到TABLE1中并返回新的ID值:

CREATE OR REPLACE FUNCTION INSERT_TABLE1(pCOL2  NUMBER, vCOL3 VARCHAR2)
  RETURNS NUMBER
AS
  nID  NUMBER;
BEGIN
  INSERT INTO TABLE1(COL2, COL3) VALUES (pCOL2, vCOL3)
    RETURNING ID1 INTO nID;

  RETURN nID;
END INSERT_TABLE1;

这为您提供了一种将数据插入到TABLE1中并获得新ID值的简便方法。

dbfiddle here