Jawaban:
Meskipun saya pikir Anda sudah membuat kolom, dalam jawaban ini saya akan asumsi bahwa kolom belum ada. IMO, kolom wajib yang unik tidak boleh ditambahkan tanpa merencanakan bagaimana mengisi baris yang ada terlebih dahulu. Karena itu, saya akan memberikan metode untuk melakukan ini mulai dari nol.
Bagaimana Anda melakukan ini tergantung pada apa yang terlibat dalam mengisi nilai-nilai.
Setelah metode apa pun yang Anda gunakan, tambahkan batasan unik pada kolom untuk memastikan integritas data. Untuk Metode 1 dan 2, ini dapat dilakukan dalam satu pernyataan atau dalam transaksi pengguna (tidak ditampilkan), dan harus dilakukan dalam transaksi pengguna dalam Metode 3.
Mungkin ada beberapa cara lain yang tidak jelas untuk melakukan ini, tapi saya pikir saya sudah membahas yang paling umum.
Metode 1: Tambahkan kolom IDENTITAS
ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL
Ini akan mengisi semua baris dalam tabel dengan nilai integer yang dimulai dengan nilai seed (1), meningkat dengan nilai increment (2) untuk setiap baris. Saya percaya bahwa urutan nilai yang dihuni tidak ditentukan (jika Anda harus menentukan pesanan, gunakan Metode 3).
Metode 2: Mengisi menggunakan batasan default
ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
CONSTRAINT DF_MyTable_MyColumn
DEFAULT (NEWSEQUENTIALID())
Ini akan melakukan tiga hal secara atom: 1. Tambahkan kolom yang tidak memungkinkan NULLnilai; 2. Buat batasan default untuk kolom; 3. Populasikan setiap baris dalam tabel menggunakan batasan default.
Meskipun contoh ini menggunakan uniqueidentifierkolom, ia berfungsi dengan baik dengan semua tipe data dan batasan default.
Metode 3: Populasikan menggunakan pernyataan UPDATE
Kasus ini akan terjadi ketika, misalnya, ada nilai dari bagian lain aplikasi Anda yang perlu ditambahkan ke tabel, atau Anda perlu menentukan urutan yang tepat untuk nilai unik.
BEGIN TRANSACTION
ALTER TABLE MyTable ADD MyColumn int NULL
UPDATE MyTable
SET MyColumn = ...
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL
COMMIT TRANSACTION
Metode 4: Mengisi menggunakan objek URUTAN
Untuk SQL Server 2012, Anda dapat mengisi kolom menggunakan nilai yang dihasilkan oleh SEQUENCEobjek - saya belum bekerja dengan ini sama sekali, jadi saya akan merujuk ke artikel MSDN untuk kelengkapan.
update mytable set mycolumn = next value for mysequence where mycolumn is null;
Jika Anda senang dengan angka mulai dari 1 yang dapat Anda gunakan row_number().
update T
set cn = rn
from (
select cn,
row_number() over(order by (select 1)) as rn
from TableX
) T
Kolom pembaruan berikut 'cn' dengan nomor urut mulai dari 1
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
coba ini untuk memperbarui menggunakan urutan ... Anda harus melakukan TOP karena urutan oleh klausa dalam pernyataan pembaruan. Saya menggunakan pernyataan ini pada 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)
Dan jika semua ini masih tidak berhasil (mungkin karena itu SQL-92 tua), Anda dapat memecahnya menjadi beberapa langkah, seperti yang disarankan oleh Ziggy Crueltyfree Zeitgeister, di sini .
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? Sepertinya fungsi / fitur Pembuat Film eksklusif. Tidak berlaku untuk SQL Server dan tidak dalam standar SQL 92.
Filemakerjadi saya tidak berpikir jawabannya relevan. Anda bisa menggunakan tabel temp dan mengisi kolom itu dengan ROW_NUMBER()fungsi.