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


13

我在表X中添加了新列

“ cn”列必须是唯一且必填的,但是旧数据没有任何值。

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

谢谢。

Answers:


11

即使我认为您已经创建了该列,但在此答案中,我仍假设该列尚不存在。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文章


谢谢大家,我将方法3与第一个答案结合使用:更新T设置cn = rn from(从TableX中选择cn,row_number()over(由(选择1)排序)为rn)T
med_alpa

使用序列的示例(假设您有一个称为mysequence的序列):update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono



0

尝试使用序列进行更新...由于update语句中的order by子句,您必须执行TOP。我在SQL SERVER 2012上使用了此语句

update invoice set RecNo = (next value for seq_invoice_recno)
where invoiceid in (select top 100000 invoiceid from invoice where RecNo is null 
order by invoiceId)

-1

而如果这一切仍然是行不通的(也许是因为它是普通的旧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标准。
ypercubeᵀᴹ

你是对的。RecordNumber是您可以在Filemaker中定义的计算列,当列在屏幕上显示以及排序之后(按Filemaker)时,它保存每一行的记录号。
加里·奇奇

好,很好,不知道。但是这里的问题没有标记,Filemaker所以我认为答案不相关。您可以使用临时表,并使用ROW_NUMBER()函数填充该列。
ypercubeᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.