我有一张桌子:
CREATE TABLE names (id serial, name varchar(20))
Run Code Online (Sandbox Code Playgroud)
我想要那个表中的“最后插入的 id”,而不是RETURNING id在插入时使用。好像有一个函数CURRVAL(),但我不明白如何使用它。
我试过:
SELECT CURRVAL() AS id FROM names_id_seq
SELECT CURRVAL('names_id_seq')
SELECT CURRVAL('names_id_seq'::regclass)
Run Code Online (Sandbox Code Playgroud)
但它们都不起作用。如何使用currval()获取最后插入的 ID?
在他对哪个更好的回答中:标识列还是生成的唯一 id 值?mrdenny 说:
当 SQL Denali 出现时,它将支持比身份更高效的序列,但您无法自己创建更高效的东西。
我不确定。知道 Oracle 的序列后,我要么为插入创建触发器,将每个插入封装到存储过程的调用中,要么祈祷我在执行临时插入时不要忘记正确使用序列。
我怀疑序列的优势是否如此明显。
SQL Server 2012+ 中SEQUENCE声明的 usingNO CACHE和声明的 using之间有什么区别CACHE 1吗?
序列#1:
CREATE SEQUENCE dbo.MySeqCache1
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999
NO CYCLE
CACHE 1;
GO
Run Code Online (Sandbox Code Playgroud)
序列#2:
CREATE SEQUENCE dbo.MySeqNoCache
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999
NO CYCLE
NO CACHE;
GO
Run Code Online (Sandbox Code Playgroud)
两者之间有什么区别吗?在 SQL Server 2012+ 环境中使用时,它们的行为会有所不同吗?
在mysql中考虑这个表
create table numbers (number int);
insert into numbers values (3), (2), (9);
select * from numbers;
+--------+
| number |
+--------+
| 3 |
| 2 |
| 9 |
+--------+
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的查询来生成一个包含以下列的表
我想你必须创建一个数字序列才能做到这一点。如果可能,我想创建这样一个序列而不将其存储在数据库中。
相关问题:是否有一个选择查询生成从 1 到 10(或 100 或 1000)的数字序列?
在级联上截断表时,有什么方法可以重置所有表序列。
我已经阅读了这篇文章如何在 postgres 中重置序列并用新数据填充 id 列?
ALTER SEQUENCE seq RESTART WITH 1;
UPDATE t SET idcolumn=nextval('seq');
Run Code Online (Sandbox Code Playgroud)
它仅适用于一个序列,但我的问题是重新启动截断表的所有序列。
考虑当我使用TRUNCATE sch.mytable CASCADE;它影响3个相关表,这意味着三个序列,是否有任何解决方案可以一次性重新启动此序列。
我有一个以这种方式创建的表:
--
-- Table: #__content
--
CREATE TABLE "jos_content" (
"id" serial NOT NULL,
"asset_id" bigint DEFAULT 0 NOT NULL,
...
"xreference" varchar(50) DEFAULT '' NOT NULL,
PRIMARY KEY ("id")
);
Run Code Online (Sandbox Code Playgroud)
稍后插入一些行并指定 id:
INSERT INTO "jos_content" VALUES (1,36,'About',...)
稍后,一些记录被插入而没有 id 并且它们因错误而失败:
Error: duplicate key value violates unique constraint。
显然,id 被定义为一个序列:

每个失败的插入都会增加序列中的指针,直到它增加到一个不再存在的值并且查询成功。
SELECT nextval('jos_content_id_seq'::regclass)
表定义有什么问题?解决这个问题的聪明方法是什么?
我正在测试和填充利用该SEQUENCE对象的特定表。在这个过程中,我正在测试用数以万计的插入行填充表(因为我不熟悉如何编程)。我在这个特定表格中看到的问题是,当我开始另一个人口测试时,SEQUENCE它不会重置回我想要的第一个数字(即 1)。
当我想重新运行一个新的测试时,我删除了有问题的表,然后运行以下命令:
DROP SEQUENCE foo.fee;
GO
DROP SCHEMA foo;
GO
Run Code Online (Sandbox Code Playgroud)
当我想重新运行测试时,我运行以下SCHEMA&SEQUENCE命令,这些命令按以下顺序触发:
CREATE SCHEMA foo;
GO
CREATE SEQUENCE foo.fee
START WITH 1
INCREMENT BY 1
NO CYCLE
NO CACHE;
GO
Run Code Online (Sandbox Code Playgroud)
然后我创建表:
CREATE TABLE foo.sample_table_with_data
(order_number bigint PRIMARY KEY NOT NULL,
sample_column_one nvarchar(max) NULL,
sample_column_two nvarchar(max) NULL,
sample_column_three nvarchar(max) NULL)
GO
Run Code Online (Sandbox Code Playgroud)
完成后,我运行以下插入命令 50,000 次:
INSERT INTO [foo].[sample_table_with_data]
(
[order_number],
[sample_column_one],
[sample_column_two],
[sample_column_three]
)
VALUES
(
NEXT VALUE FOR foo.fee,
'Blah',
'Blah Blah',
'Blah …Run Code Online (Sandbox Code Playgroud) 我们正在考虑使用共享序列为数据库中所有表的主键分配 ID。其中大约有 100 个。只有一对夫妇经常和定期插入。在我们进入实际尝试和负载测试阶段之前,我们想排除它是“出于明显原因的糟糕想法”。
我们的峰值负载是每秒 1000 次插入,跨几个表。
到目前为止,我们的研究表明 - 序列生成速度不应该是问题 - 序列碎片(间隙)会发生,但不应该是问题 - id 耗尽不会是问题
我们不确定我们是否错过了其他重要的事情。我们会感谢人们的意见,尤其是那些之前尝试过并有过正面或负面经历的人的意见。
对于上下文 - 我们这样做有两个主要动机。
这样做的一个动机是我们可以定义一堆字典(我们称之为范围)并将人类可读的单词分配给这些 id,因此我们希望确保不同表中的 id 永远不会重叠。因此,在一个范围内,id 12345 可能被分配值“Green”,而在另一个范围内,它可能被分配“Verde”。(实际上,我们不会将它用于国际化,但我们可能有一天会使用它)。
另一个动机是使在现场有多个部署变得容易,并且知道(通过唯一设置每个部署的几个最高有效数字的序列)我们的部署不会重叠主键。(就像一个 GUID 精简版)。
将 BIGSERIAL 列添加到大表(约 3 Bil. 行,约 174Gb)的最快方法是什么?
编辑:
NOT NULL) 的递增值。我有一个像这样定义的 Oracle 序列:
CREATE SEQUENCE "DALLAS"."X_SEQ"
MINVALUE 0
MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 0 NOCACHE NOORDER NOCYCLE ;
Run Code Online (Sandbox Code Playgroud)
它在存储过程中用于插入记录:
PROCEDURE Insert_Record
(p_name IN VARCHAR2,
p_userid IN INTEGER,
cur_out OUT TYPES_PKG.RefCursor)
IS
v_id NUMBER := 0;
BEGIN
-- Get id value from sequence
SELECT x_seq.nextval
INTO v_id
FROM dual;
-- Line below is X_PKG line 40
INSERT INTO X
(the_id,
name,
update_userid)
VALUES
(v_id,
p_name,
p_userid);
-- Return new id
OPEN cur_out FOR
SELECT v_id the_id
FROM dual;
END; …Run Code Online (Sandbox Code Playgroud) sequence ×10
postgresql ×5
sql-server ×3
insert ×1
mysql ×1
oracle ×1
performance ×1
truncate ×1
update ×1
uuid ×1