我需要有关数据库中大量表的插入语句的帮助。 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)
的东西可以潜在地解决我的问题,但我不知道如何使用它。
答案 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值的简便方法。