シーケンス番号/文字または任意の一意のデータで既存の行を更新する


13

表Xに新しい列を追加しました

この列「cn」は一意かつ必須である必要がありますが、古いデータには値がありません。

固有またはランダムな固有データで既存のレコードを更新する方法は?

ありがとうございました。

回答:


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())

これは原子的に3つのことを行います。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を使用します。update Tは(TABLEXからRNとして(1を選択))によって(順番上CN、ROW_NUMBER()を選択)TからCN = RNを設定
med_alpa

シーケンスの使用例(mysequenceというシーケンスがあると仮定):update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono

14

1から始まる番号に満足している場合は、を使用できますrow_number()

update T
set cn = rn
from (
       select cn,
              row_number() over(order by (select 1)) as rn
       from TableX
     ) T


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であるため)、ここで Ziggy 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ᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.