SQL服务器:创建一个列作为重复模式的标识
SQL Server : create a column as an Identity that repeats a pattern
在 SQL Server 2008 R2 中,我知道如何创建一个主键列来使我的行保持唯一(下面示例中的列 3),但我还需要一个自动填充一组重复的列整数(下面示例中的第 2 列)。
我不知道如何创建这样的专栏。搜索表明它可以用 "reseeding" 完成,但不确定如何实际创建此列,或者是否有可能自动执行此操作。
我正在寻找这样的东西,每次创建新行时都会自动填充 Column2:
Column1 Column2 Column3
name1 1 1
name2 2 2
name3 3 3
name4 4 4
name5 5 5
name6 1 6
name7 2 7
name8 3 8
name9 4 9
name10 5 10
name11 1 11
name12 2 12
您可以通过执行以下操作来使用持久化列:
ALTER TABLE Table_Name ADD Column2 AS (Column3 % 5)
虽然我认为这会给你 0-4 而不是 1-5,但它应该让你走上正确的轨道,在 Column3 上做一些数学运算来创建你正在寻找的列。
对于一个不断更新的答案,如果行被删除,你可以做这样的事情:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION dbo.GetTableValue
(
@Index int
)
RETURNS int
AS
BEGIN
DECLARE @Result int
SELECT @Result = COUNT(*) % 5
FROM dbo.TABLE
WHERE PrimaryKey < @Index
RETURN @Result
END
GO
ALTER TABLE dbo.TableName ADD CalcValue AS (dbo.GetTableValue(PrimaryKey));
该查询尚未经过全面测试,但应该会让您走上正确的道路。再一次,这会损害大型数据库的性能,因为每次从数据库读取时都会执行查询。
如果您使用的是 SQL Server 2012 或 2014,您可以(并且应该)使用 SEQUENCE
:
CREATE SEQUENCE dbo.FiveCount
AS tinyint
START WITH 1
INCREMENT BY 1
CYCLE
MINVALUE 1
MAXVALUE 5
;
然后定义SEQUENCE
的下一个值作为该列的默认值:
CREATE TABLE test_table
([Column1] varchar(6),
[Column2] int CONSTRAINT DF_testTable_col2 DEFAULT NEXT VALUE FOR FiveCount,
[Column3] int)
;
Here is a SQLFiddle of this SEQUENCE
being created, followed by a series of inserts, then a select all to show the results of the insertions.
编辑:请注意,像这样将结果插入 table 意味着如果删除一行,序列将被破坏。
更动态的方法可能类似于以下内容(假设序列已经到位):
CREATE TABLE test_table (
[Column1] varchar(6),
[Column3] int
);
然后,当你想 select 来自 table:
SELECT
Column1,
NEXT VALUE FOR FiveCount AS Column2,
Column3
FROM test_table
无论 test_table
的状态如何,此查询都会确保您始终获得完整的序列
如果 SEQUENCE
始终以 1 开头很重要,您可以 RESTART
像这样:
ALTER SEQUENCE dbo.FiveCount RESTART WITH 1
正在重新启动 SEQUENCE
的 Here's a SQLFiddle,然后是 select 查询,然后是从 test_table
中删除,然后是另一个重新启动实例和 select 查询.
能不能在查询数据的时候设置顺序,而不是持久化顺序?如果您的 table 被大量使用,这对服务器健康来说可能会好得多。这也将使您的数据始终具有一致的序列。
如果您需要 1-5 序列,请使用 case 语句和模数:
Select
Column1
,Case When Row_number() Over(order by Column1)%5 =0
Then 5
Else Row_number() Over(order by Column1)%5
End as Column2
,Row_number() Over(order by ID) as Column3
From TableName
在 SQL Server 2008 R2 中,我知道如何创建一个主键列来使我的行保持唯一(下面示例中的列 3),但我还需要一个自动填充一组重复的列整数(下面示例中的第 2 列)。
我不知道如何创建这样的专栏。搜索表明它可以用 "reseeding" 完成,但不确定如何实际创建此列,或者是否有可能自动执行此操作。
我正在寻找这样的东西,每次创建新行时都会自动填充 Column2:
Column1 Column2 Column3
name1 1 1
name2 2 2
name3 3 3
name4 4 4
name5 5 5
name6 1 6
name7 2 7
name8 3 8
name9 4 9
name10 5 10
name11 1 11
name12 2 12
您可以通过执行以下操作来使用持久化列:
ALTER TABLE Table_Name ADD Column2 AS (Column3 % 5)
虽然我认为这会给你 0-4 而不是 1-5,但它应该让你走上正确的轨道,在 Column3 上做一些数学运算来创建你正在寻找的列。
对于一个不断更新的答案,如果行被删除,你可以做这样的事情:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION dbo.GetTableValue
(
@Index int
)
RETURNS int
AS
BEGIN
DECLARE @Result int
SELECT @Result = COUNT(*) % 5
FROM dbo.TABLE
WHERE PrimaryKey < @Index
RETURN @Result
END
GO
ALTER TABLE dbo.TableName ADD CalcValue AS (dbo.GetTableValue(PrimaryKey));
该查询尚未经过全面测试,但应该会让您走上正确的道路。再一次,这会损害大型数据库的性能,因为每次从数据库读取时都会执行查询。
如果您使用的是 SQL Server 2012 或 2014,您可以(并且应该)使用 SEQUENCE
:
CREATE SEQUENCE dbo.FiveCount
AS tinyint
START WITH 1
INCREMENT BY 1
CYCLE
MINVALUE 1
MAXVALUE 5
;
然后定义SEQUENCE
的下一个值作为该列的默认值:
CREATE TABLE test_table
([Column1] varchar(6),
[Column2] int CONSTRAINT DF_testTable_col2 DEFAULT NEXT VALUE FOR FiveCount,
[Column3] int)
;
Here is a SQLFiddle of this SEQUENCE
being created, followed by a series of inserts, then a select all to show the results of the insertions.
编辑:请注意,像这样将结果插入 table 意味着如果删除一行,序列将被破坏。
更动态的方法可能类似于以下内容(假设序列已经到位):
CREATE TABLE test_table (
[Column1] varchar(6),
[Column3] int
);
然后,当你想 select 来自 table:
SELECT
Column1,
NEXT VALUE FOR FiveCount AS Column2,
Column3
FROM test_table
无论 test_table
如果 SEQUENCE
始终以 1 开头很重要,您可以 RESTART
像这样:
ALTER SEQUENCE dbo.FiveCount RESTART WITH 1
正在重新启动 SEQUENCE
的 Here's a SQLFiddle,然后是 select 查询,然后是从 test_table
中删除,然后是另一个重新启动实例和 select 查询.
能不能在查询数据的时候设置顺序,而不是持久化顺序?如果您的 table 被大量使用,这对服务器健康来说可能会好得多。这也将使您的数据始终具有一致的序列。
如果您需要 1-5 序列,请使用 case 语句和模数:
Select
Column1
,Case When Row_number() Over(order by Column1)%5 =0
Then 5
Else Row_number() Over(order by Column1)%5
End as Column2
,Row_number() Over(order by ID) as Column3
From TableName