在我的系统中,我希望每个用户都有自己的文章id序列。
因此,我创建了一个数据库,其中包含一个表,描述了users它们之间的对应关系articles。以下是该表的概要:
+------+----------+---------+
| 身份证 | 文章 | 用户 ID |
+------+----------+---------+
| 1 |一些笔记| 1 |
+------+----------+---------+
| 2 |一些笔记| 1 |
+------+----------+---------+
| 3 |一些笔记| 2 |
+------+----------+---------+
| 4 |一些笔记| 2 |
+------+----------+---------+
| 5 |一些笔记| 3 |
+------+----------+---------+
但我想ids通过以下方式在这个表中生成:
+------+----------+---------+
| 身份证 | 文章 | 用户 ID |
+------+----------+---------+
| 1 |一些笔记| 1 |
+------+----------+---------+
| 2 |一些笔记| 1 |
+------+----------+---------+
| 1 |一些笔记| 2 … serial我的应用程序表中有一个ID。但是,我想插入一个0id 记录来表示全局。
有没有一种方法可以将它插入我的桌子而不影响计数器?
对于serialPostgresql < 10 中使用的列,我们按名称管理序列。我们能够通过以下方式重置序列:
SELECT setval('table_id_seq', (SELECT MAX(id) FROM table));
Run Code Online (Sandbox Code Playgroud)
从版本 10 开始,使用标识列,无需使用序列名称。那很好。
ALTER TABLE table ALTER COLUMN id RESTART WITH 1000;
Run Code Online (Sandbox Code Playgroud)
如何在max(id)不知道序列名称的情况下将标识列设置为?
就我从ALTER TABLE 语法中看到的而言,没有办法让子查询来计算序列的开始。
我想写一些类似的东西:
ALTER TABLE table ALTER COLUMN id RESTART WITH (SELECT MAX(id) FROM table);
Run Code Online (Sandbox Code Playgroud) 使用双表通过直接插入读取序列的 nextval 时是否会影响性能?
我目前正在优化大型 IT 系统中的性能,我发现几乎所有的 sequence.nextval 都是通过以下方式读取的:
SELECT SOME_SQ.NEXTVAL INTO someID FROM DUAL;
insert into .... (someId)
Run Code Online (Sandbox Code Playgroud)
我想知道在标准上使用上述方式时性能是否会受到影响:
insert into .... (some_sq.nexval, ...)
Run Code Online (Sandbox Code Playgroud)
谢谢
在 Oracle 中,给定以下对象:
create table a (x number );
create table b (val number );
create table c (val number );
create sequence my_seq;
Run Code Online (Sandbox Code Playgroud)
假设我a按如下方式填充表:
insert into a (x) values (1);
insert into a (x) values (2);
insert into a (x) values (3);
insert into a (x) values (4);
Run Code Online (Sandbox Code Playgroud)
使用 中的值a,我想填充表b,c如下所示:当a.x为偶数时,从序列中生成一个新数字并插入my_seq.nextval到b.valand 中c.val;否则,将my_seq.currval(最近生成的值但不是新值)插入到c.val.
我目前拥有的是一个 insert all 语句,如下所示:
insert all
when mod(x,2) …Run Code Online (Sandbox Code Playgroud) 我想在一个WITH包含这个等差数列的子句中生成一个命名表:
????????????
? mynumber ?
????????????
? 0 ?
? 30 ?
? 60 ?
? 90 ?
? 120 ?
? 150 ?
? 180 ?
? 210 ?
????????????
Run Code Online (Sandbox Code Playgroud)
...基于变量p_maxnumber(p_maxnumber例如此处= 211)。
理想情况下,它将采用以下格式:
WITH sequenceTable AS
(SELECT mynumber
FROM ...),
Run Code Online (Sandbox Code Playgroud)
在同一WITH个子句中,我想在下游派生表中使用该序列来获取数据并最终用作图表呈现的时间轴。我有一种感觉有一种方法可以使用创建序列来做到这一点?只是想找到一种方法来创造这个仍然......
我们有一个附加+只读的表。我们希望多个应用程序以一种廉价且简单的方式(无需更改跟踪)使用该数据库中显示的所有新行。
让每个应用程序记录最后一个 ID 的简单建议似乎并不安全。假设 3 个连接(2 个作者和 1 个读者)这样做:
W1: BEGIN TRAN, INSERT 1000 Records (IDs 1-1000)
W2: BEGIN TRAN, INSERT 1000 Records (IDs 1001-2000)
W2: COMMIT
R1: SELECT * WHERE Id > 0 (last sync value)
W1: COMMIT (or possibly ROLLBACK)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,阅读器将获得记录 1001-2000,并将 2000 保存为最高 ID。显然这是不正确的。假设各种编写器以不同的速度运行(因此我们永远不能假设它们会因延迟或性能而按顺序提交),有哪些选择?
我们是否必须求助于更改跟踪之类的方法,或者要求每个应用程序保存最后的 (batch*writers*x) ID 并重新读取它们以确保它们没有遗漏任何一个?
回滚和序列中的其他间隙(MSSQL 可以将 ID 跳转 1000;很确定其他 DB 在某些情况下会这样做)使得尝试猜测是否跳过行变得很复杂。另外,批量插入可能不是正确的批次;它们可以由多个 INSERT 语句组成,这意味着每个 tx 甚至可能没有分配一个连续的 ID 块。
如果有特定于该系统的 hack,我们目前正在使用 MSSQL 2012,但我对一般情况更感兴趣。
使用 SQL Server 生成自定义自动生成序列的最佳方法是什么?
这是我的要求:
我的应用程序托管在 10 台未互连的独立服务器上。
每个实例都应该生成一个序列号,所有这些数据将使用 SQL Server 的合并复制合并到所有数据库中。
生成的序列在所有服务器中应该是唯一的。
为了实现这一点,我创建了一个函数来为序列号添加服务器 id 前缀,并将其用作计算列。但是当我添加数据时,出现以下异常:
“已超出最大存储过程、函数、触发器或视图嵌套级别(限制为 32)。”
这是我的表和函数。请提出更好的方法。
create table Customers
(
CID int identity not null primary key,
CustomerName varchar(50)
)
ALTER function [dbo].[NextCustomerNumber]()
returns bigint
as
begin
declare @lastval bigint
declare @serverId int
declare @newval bigint
set @lastval = (select max(CustomerNumber) from Customers)
set @serverId= 1 -- Server ID pulls from some settings
set @newval=CONVERT(bigint, (CAST(@serverId as varchar(2))+CONVERT( varchar(10),(RIGHT(@lastval,(LEN(@lastval)-LEN(@serverId)))+1))))
return @newval
end
Alter table Customers add CustomerNumber …Run Code Online (Sandbox Code Playgroud) 我尝试\ds没有得到任何关系数据。
但我用SELECT * FROM information_schema.sequences;可以获取所有数据。
为什么不起作用\ds?
我创建了一个这样的序列:
CREATE SEQUENCE seq_test2
MINVALUE 0
MAXVALUE 999999999999999999999999999
START WITH 0
INCREMENT BY 1;
Run Code Online (Sandbox Code Playgroud)
这两个查询都显示数字 0:
select SEQ_TEST2.nextval from DUAL;
select SEQ_TEST2.currval from DUAL;
Run Code Online (Sandbox Code Playgroud)
我有一张桌子,你可以在这里看到:
create table STUDENT
(
st_id NUMBER,
first_name VARCHAR2(150),
last_name VARCHAR2(150)
)
Run Code Online (Sandbox Code Playgroud)
执行下面的查询后,
select t.st_id , nvl(t.st_id , seq_test2.nextval) as seq
from STUDENT t
Run Code Online (Sandbox Code Playgroud)
当列中没有空值时st_id,我得到的结果是这样的:
st_id seq
---------------
1 1
2 2
3 3
4 4
5 5
Run Code Online (Sandbox Code Playgroud)
当我插入列为 null 的行时st_id,执行上面的查询后,结果如下所示:
st_id seq
---------------
1 1
2 2
3 3
4 4 …Run Code Online (Sandbox Code Playgroud) sequence ×10
oracle ×4
postgresql ×4
identity ×3
insert ×2
oracle-11g ×1
plsql ×1
psql ×1
query ×1
replication ×1
sql-server ×1