使用序列号/字符或任何唯一数据更新现有行

med*_*lpa 13 sql-server

我在表 X 中添加了一个新列

“cn”这一列必须是唯一的和强制性的,但旧数据没有任何价值。

如何使用顺序或随机唯一数据更新现有记录?

谢谢你。

Mik*_*son 14

如果您对从 1 开始的数字感到满意,则可以使用row_number().

update T
set cn = rn
from (
       select cn,
              row_number() over(order by (select 1)) as rn
       from TableX
     ) T
Run Code Online (Sandbox Code Playgroud)


Jon*_*gel 11

尽管我认为您已经创建了该列,但在此答案中,我将假设该列尚不存在。国际海事组织,唯一的要求列应该永远不会在没有计划如何先填充现有行补充说。因此,我将提供从零开始执行此操作的方法。


您如何执行此操作取决于填充值所涉及的内容。

无论使用哪种方法,都要在列上添加唯一约束以确保数据完整性。对于方法 1 和 2,这可以在单个语句或用户事务(未显示)中完成,并且应该在方法 3 中的用户事务中完成。

可能还有其他一些晦涩的方法可以做到这一点,但我想我已经介绍了最常见的方法。


方法 1:添加 IDENTITY 列

ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL
Run Code Online (Sandbox Code Playgroud)

这将使用从种子值 (1) 开始的整数值填充表中的所有行,每行增加增量值 (2)。我相信填充值的顺序是未定义的(如果必须指定顺序,请使用方法 3)。


方法 2:使用默认约束填充

ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
    CONSTRAINT DF_MyTable_MyColumn
        DEFAULT (NEWSEQUENTIALID())
Run Code Online (Sandbox Code Playgroud)

这将原子地做三件事: 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
Run Code Online (Sandbox Code Playgroud)

方法 4:使用 SEQUENCE 对象填充

对于 SQL Server 2012,您可以使用SEQUENCE对象生成的值填充列——我还没有使用过它,因此我将参考MSDN 文章以确保完整性。


小智 10

以下更新列“cn”,序号从 1 开始

DECLARE @id INT 
SET @id = 0 
UPDATE X
SET @id = cn = @id + 1 
GO 
Run Code Online (Sandbox Code Playgroud)

http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/