SQL 中的自动递增主键

Auto-increment primary keys in SQL

我需要有关数据库中大量表的插入语句的帮助。 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) 的东西可能会解决我的问题,但我不知道如何使用它。

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

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

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

然后定义一个函数,将数据插入 TABLE1 和 returns 新 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

Multiple tables use the same sequence of auto-generated primary keys when user creates a static data record from the GUI.

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

相反,每个 table 都有自己独立的主键序列。在 MySQL 中是 id bigint auto_increment primary key. In Postgres you'd use bigserial. In Oracle 12c it's number generated as identity.

create table users (
    id number generated as identity,
    name text not null
);

create table things (
    id number generated as identity,
    description text not null
);

然后你插入每个,离开 id,或将其设置为空。数据库将从每个序列中填充它。

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

如果您的架构未设置自动递增、排序的主键,您可以更改架构以使用它们。只需确保将每个序列设置为最大 ID + 1。这是迄今为止长 运行.

中最理智的选项

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

create sequence master_seq
  start with ...

然后用nextval得到下一个密钥。

insert into rule (pk_rule, name, ruleid, description) 
values (master_seq.nextval, 'TESTRULE', 14, 'TEST RULE DESCRIPTION')

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