回答:
すでに列を作成していると思いますが、この回答では、列がまだ存在していないという仮定にしています。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の記事で完全性を確認します。
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であるため)、ここで 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標準には適用されません。
Filemaker
いないため、答えが関連しているとは思いません。ROW_NUMBER()
ただし、一時テーブルを使用して、その列を関数で埋めることができます。