Answers:
即使我认为您已经创建了该列,但在此答案中,我仍假设该列尚不存在。IMO,在未计划如何首先填充现有行的情况下,切勿添加唯一的必需列。因此,我将提供从零开始的方法。
如何执行此操作取决于填充值所涉及的内容。
无论使用哪种方法,都在列上添加唯一约束以确保数据完整性。对于方法1和2,这可以在单个语句内或在用户事务(未显示)内完成,并且应在方法3的用户事务内完成。
可能还有其他一些晦涩的方法可以做到这一点,但是我认为我已经介绍了最常见的方法。
方法1:添加一个IDENTITY列
ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL
这将使用从种子值(1)开始的整数值填充表中的所有行,并为每行增加增量值(2)。我相信填充值的顺序是不确定的(如果必须指定顺序,请使用方法3)。
方法2:使用默认约束进行填充
ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
CONSTRAINT DF_MyTable_MyColumn
DEFAULT (NEWSEQUENTIALID())
这将自动完成三件事:1.添加一个不允许NULL
值的列;2.为该列创建一个默认约束;3.使用默认约束填充表中的每一行。
尽管此示例使用uniqueidentifier
列,但它与任何数据类型和默认约束同样适用。
方法3:使用UPDATE语句填充
例如,当应用程序的另一部分中有一个值需要添加到表中,或者您需要为唯一值指定确切顺序时,就会发生这种情况。
BEGIN TRANSACTION
ALTER TABLE MyTable ADD MyColumn int NULL
UPDATE MyTable
SET MyColumn = ...
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL
COMMIT TRANSACTION
方法4:使用SEQUENCE对象进行填充
对于SQL Server 2012,您可以使用SEQUENCE
对象生成的值填充列-我还没有使用过它,因此出于完整性考虑,我将参考MSDN文章。
update mytable set mycolumn = next value for mysequence where mycolumn is null;
如果您对从1开始的数字感到满意,可以使用row_number()
。
update T
set cn = rn
from (
select cn,
row_number() over(order by (select 1)) as rn
from TableX
) T
以下更新序列号从1开始的“ cn”列
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
而如果这一切仍然是行不通的(也许是因为它是普通的旧SQL-92),可以将其分为多个步骤,由齐格Crueltyfree Zeitgeister的建议,在这里。
CREATE TABLE sorting (sid numeric(10,10), rn int);
INSERT INTO sorting (sid, rn)
SELECT SortID, RecordNumber FROM Beleg
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210
ORDER BY SortID;
UPDATE Beleg SET SortID = (SELECT rn FROM sorting WHERE sid=Beleg.SortID)
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210;
DROP TABLE sorting;
RecordNumber
什么 好像是专有的Filemaker功能/功能。不适用于SQL Server,也不适用于SQL 92标准。
Filemaker
所以我认为答案不相关。您可以使用临时表,并使用ROW_NUMBER()
函数填充该列。