Perbarui baris yang ada dengan nomor kuadrat / char atau data unik apa pun

13

Saya menambahkan kolom baru di Tabel X

Kolom ini "cn" harus unik dan wajib, tetapi data lama tidak memiliki nilai.

Bagaimana cara memperbarui catatan yang ada dengan data unik secara langsung atau acak?

Terima kasih.

med_alpa
sumber

Jawaban:

11

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.

Jon Seigel
sumber
Terima kasih semua, saya menggunakan metode 3 dengan kombinasi dengan jawaban pertama: perbarui T set cn = rn dari (pilih cn, row_number () di atas (pesanan oleh (pilih 1)) sebagai rn dari TableX) T
med_alpa
Contoh menggunakan urutan (dengan asumsi Anda memiliki urutan yang disebut my berikutnyaence):update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono
14

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
Mikael Eriksson
sumber
0

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)
Hewstone
sumber
-1

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;
Gary Czychi
sumber
Apa ini RecordNumber? Sepertinya fungsi / fitur Pembuat Film eksklusif. Tidak berlaku untuk SQL Server dan tidak dalam standar SQL 92.
ypercubeᵀᴹ
Ya kau benar. RecordNumber adalah kolom terhitung yang dapat Anda tentukan di Pembuat Film, yang menyimpan nomor catatan setiap baris ketika ditampilkan di layar dan setelah diurutkan (oleh Pembuat Film).
Gary Czychi
Oke, bagus, tidak tahu itu. Tetapi pertanyaan di sini tidak ditandai dengan Filemakerjadi saya tidak berpikir jawabannya relevan. Anda bisa menggunakan tabel temp dan mengisi kolom itu dengan ROW_NUMBER()fungsi.
ypercubeᵀᴹ