相关疑难解决方法(0)

为什么 Denali 序列应该比身份列表现更好?

在他对哪个更好的回答中:标识列还是生成的唯一 id 值?mrdenny 说:

当 SQL Denali 出现时,它将支持比身份更高效的序列,但您无法自己创建更高效​​的东西。

我不确定。知道 Oracle 的序列后,我要么为插入创建触发器,将每个插入封装到存储过程的调用中,要么祈祷我在执行临时插入时不要忘记正确使用序列。

我怀疑序列的优势是否如此明显。

sql-server sequence sql-server-2012

36
推荐指数
2
解决办法
4003
查看次数

IDENTITY 列中出现意外空白

我正在尝试生成从 1 开始并以 1 递增的唯一采购订单编号。我使用此脚本创建了一个 PONumber 表:

CREATE TABLE [dbo].[PONumbers]
(
  [PONumberPK] [int] IDENTITY(1,1) NOT NULL,
  [NewPONo] [bit] NOT NULL,
  [DateInserted] [datetime] NOT NULL DEFAULT GETDATE(),
  CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC)    
);
Run Code Online (Sandbox Code Playgroud)

以及使用此脚本创建的存储过程:

CREATE PROCEDURE [dbo].[GetPONumber] 
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1);
    SELECT SCOPE_IDENTITY() AS PONumber;
END
Run Code Online (Sandbox Code Playgroud)

在创建时,这工作正常。当存储过程运行时,它从所需的数字开始并以 1 递增。

奇怪的是,如果我关闭或休眠我的计算机,那么下次运行该程序时,序列已提前了近 1000。

见下面的结果:

采购订单编号

你可以看到数字从 8 跃升到了 1002!

  • 为什么会这样?
  • 我如何确保不会像那样跳过数字?
  • 我所需要的只是让 SQL 生成以下数字:
    • a) 保证唯一。
    • b) 增加所需的数量。

我承认我不是 SQL 专家。我是否误解了 SCOPE_IDENTITY() 的作用?我应该使用不同的方法吗?我查看了 SQL 2012+ 中的序列,但微软表示默认情况下不能保证它们是唯一的。

sql-server identity sql-server-2012

19
推荐指数
1
解决办法
2万
查看次数

这种设置有我不知道的原因/好处吗?

我现在管理一个由另一个人设计和创建的 MySQL 数据库。

我对原始开发人员创建的某个设置感到困惑。

他没有对表 ID 使用自动增量。相反,他创建了一个名为system_sequences的表 ,它有两列:

system_sequences.Table_Name 
system_sequences.Next_Value
Run Code Online (Sandbox Code Playgroud)

这是一个表的示例以及它当前如何插入表中(尽我所能):

有一个名为customer的表,有一个唯一的 ID 列。

如果我想插入客户,目前我必须执行以下操作:

SELECT system_sequences.Next_Value 
FROM system_sequences 
WHERE system_sequences.Table_Name = 'customer'
Run Code Online (Sandbox Code Playgroud)

将 next_value 保存到变量中并将其用作客户的下一个 ID

那么我必须:

UPDATE system_sequences 
SET Next_Value = Next_Value + 1 
WHERE system_sequences.Table_Name = 'customer'
Run Code Online (Sandbox Code Playgroud)

我没有设计这个,我不喜欢它的任何形状或形式(我实际上讨厌它)并且我想小心地将所有内容转换为 auto_increment

但是否有原因或我不知道的好处?我以前从未见过类似的东西。并且此数据库没有任何文档可以解释任何内容。

mysql database-design mysql-5.5

5
推荐指数
1
解决办法
298
查看次数

我可以在 Oracle 中实现“无缝”标识列吗?

在 SQL Server 中很容易编写:

create table #tmp (
    id      integer identity(1,1) primary key,
    message varchar(256)
);
Run Code Online (Sandbox Code Playgroud)

当我尝试将其迁移到 Oracle 时,我最终得到:

CREATE GLOBAL TEMPORARY TABLE tmp(
    id integer primary key,
    message varchar2(256)
) ON COMMIT PRESERVE ROWS;

CREATE SEQUENCE S_TMP_ID START WITH 1;

CREATE OR REPLACE TRIGGER TR_TMP 
BEFORE INSERT ON tmp
FOR EACH ROW
WHEN (new.id IS NULL)
BEGIN
  SELECT S_TMP_ID.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;
/
Run Code Online (Sandbox Code Playgroud)

好的。我得到了独特的、不断增加的 id 值。但是,当两个会话同时使用同一个全局临时表时,我的想法序列就会出现差距,并且它们以某个任意值开始。

任何想法如何为全局临时表创建更好的标识值?

oracle identity

1
推荐指数
1
解决办法
2031
查看次数