Sql server 如何使用序列只插入唯一的数字?
我正在使用托盘,它们的ID从10000000到15000000不等。这种方法每年循环几次,目前的解决方案是使用一个带有当前Sql server 如何使用序列只插入唯一的数字?,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我正在使用托盘,它们的ID从10000000到15000000不等。这种方法每年循环几次,目前的解决方案是使用一个带有当前托盘id的表,该表带有一个触发器,该触发器将在15000000重置回10000000,通常这不是一个问题,因为在发生这种情况时,所有数字都将再次可用。这现在是一个问题,也是一个问题 我一直在考虑使用SEQUENCE,而不是将这个额外的表与触发器一起使用 到目前为止,我得出的结论是: sp\u计数器下一个值 CREATE SEQUENCE [Database].sp_Count
托盘id
的表,该表带有一个触发器,该触发器将在15000000重置回10000000,通常这不是一个问题,因为在发生这种情况时,所有数字都将再次可用。这现在是一个问题,也是一个问题
我一直在考虑使用SEQUENCE
,而不是将这个额外的表与触发器一起使用
到目前为止,我得出的结论是:
sp\u计数器下一个值
CREATE SEQUENCE [Database].sp_Counter_NextValue
AS int
START WITH 10000000
INCREMENT BY 1
MINVALUE 10000000
MAXVALUE 15000000
CYCLE
CREATE SEQUENCE [dbo].[SEQ_PALLET]
AS [bigint]
START WITH 10010341
INCREMENT BY 1
MINVALUE 10000000
MAXVALUE 15000000
CYCLE
CACHE
GO
CREATE SEQUENCE [dbo].[SEQ_PICK_PALLET]
AS [bigint]
START WITH 5541980
INCREMENT BY 1
MINVALUE 1000000
MAXVALUE 9999999
CYCLE
CACHE
GO
ALTER PROCEDURE [dbo].[sp_Counter_NextValue]
@name nvarchar(24)
AS
BEGIN
SET NOCOUNT ON;
declare @value bigint
IF @name = 'PALLET'
BEGIN
SELECT @value = NEXT VALUE FOR SEQ_PALLET
END
ELSE IF @name = 'PICK_PALLET'
BEGIN
SELECT @value = NEXT VALUE FOR SEQ_PICK_PALLET
END
SELECT @value as VALUE
RETURN @value
END
插入
INSERT INTO X_PALLETS (sp_Counter_NextValue, information)
例如,当计数器达到其最大值时,X_托盘中存在10000000个数字时,我如何跳过该数字?这是最终的解决方案 序列
CREATE SEQUENCE [Database].sp_Counter_NextValue
AS int
START WITH 10000000
INCREMENT BY 1
MINVALUE 10000000
MAXVALUE 15000000
CYCLE
CREATE SEQUENCE [dbo].[SEQ_PALLET]
AS [bigint]
START WITH 10010341
INCREMENT BY 1
MINVALUE 10000000
MAXVALUE 15000000
CYCLE
CACHE
GO
CREATE SEQUENCE [dbo].[SEQ_PICK_PALLET]
AS [bigint]
START WITH 5541980
INCREMENT BY 1
MINVALUE 1000000
MAXVALUE 9999999
CYCLE
CACHE
GO
ALTER PROCEDURE [dbo].[sp_Counter_NextValue]
@name nvarchar(24)
AS
BEGIN
SET NOCOUNT ON;
declare @value bigint
IF @name = 'PALLET'
BEGIN
SELECT @value = NEXT VALUE FOR SEQ_PALLET
END
ELSE IF @name = 'PICK_PALLET'
BEGIN
SELECT @value = NEXT VALUE FOR SEQ_PICK_PALLET
END
SELECT @value as VALUE
RETURN @value
END
存储过程
CREATE SEQUENCE [Database].sp_Counter_NextValue
AS int
START WITH 10000000
INCREMENT BY 1
MINVALUE 10000000
MAXVALUE 15000000
CYCLE
CREATE SEQUENCE [dbo].[SEQ_PALLET]
AS [bigint]
START WITH 10010341
INCREMENT BY 1
MINVALUE 10000000
MAXVALUE 15000000
CYCLE
CACHE
GO
CREATE SEQUENCE [dbo].[SEQ_PICK_PALLET]
AS [bigint]
START WITH 5541980
INCREMENT BY 1
MINVALUE 1000000
MAXVALUE 9999999
CYCLE
CACHE
GO
ALTER PROCEDURE [dbo].[sp_Counter_NextValue]
@name nvarchar(24)
AS
BEGIN
SET NOCOUNT ON;
declare @value bigint
IF @name = 'PALLET'
BEGIN
SELECT @value = NEXT VALUE FOR SEQ_PALLET
END
ELSE IF @name = 'PICK_PALLET'
BEGIN
SELECT @value = NEXT VALUE FOR SEQ_PICK_PALLET
END
SELECT @value as VALUE
RETURN @value
END
我不认为你可以用序列来做这件事。您可以定义
唯一
约束,并导致插入失败,然后重试,直到成功。或者,您可以使用一个触发器来递增序列直到成功,但我认为您不能自动执行此操作。@GordonLinoff我很担心这一点。如果您使用IDENTITY
但试图插入现有ID,或者将您的标识种子改为在现有值之前启动,您也会遇到同样的问题。为什么不为序列使用BIGINT并在任何现有值之后开始?X_托盘是否只包含活动记录,即托盘ID在处理后从表中删除?@目标数据是。