Mevcut satırları kare numarası / karakter veya benzersiz verilerle güncelleyin


13

Tablo X'a yeni bir sütun ekledim

Bu "cn" sütununun benzersiz ve zorunlu olması gerekir, ancak eski verilerin herhangi bir değeri yoktur.

Mevcut kayıtları sıralı veya rastgele benzersiz verilerle nasıl güncelleyebilirim?

Teşekkür ederim.

Yanıtlar:


11

Sütunu zaten yarattığınızı düşünsem de, bu cevapta sütunun henüz var olmadığı varsayımına devam ediyorum. IMO, benzersiz bir gerekli sütun, önce mevcut satırların nasıl doldurulacağını planlamadan asla eklenmemelidir. Bu nedenle, sıfırdan başlayarak bunu yapmak için yöntemler sağlayacağım.


Bunu nasıl yapacağınız, değerleri doldurmaya neyin dahil olduğuna bağlıdır.

Hangi yöntemi kullanırsanız kullanın, veri bütünlüğünü sağlamak için sütuna benzersiz bir kısıtlama ekleyin. Yöntem 1 ve 2 için bu, tek bir ifade içinde veya bir kullanıcı işlemi (gösterilmemiştir) içinde yapılabilir ve Yöntem 3'teki kullanıcı işlemi içinde yapılmalıdır.

Muhtemelen bunu yapmanın birkaç başka yolu var, ama bence en yaygın olanı ele aldım.


Yöntem 1: bir kimlik sütunu ekleme

ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL

Bu, tablodaki tüm satırları, her satır için artış değeri (2) artarak, tohum değeri (1) ile başlayan tamsayı değerleriyle doldurur. Değerlerin doldurulma sırasının tanımsız olduğuna inanıyorum (bir sipariş belirtmeniz gerekiyorsa, Yöntem 3'ü kullanın).


Yöntem 2: Varsayılan bir kısıtlama kullanarak doldurma

ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
    CONSTRAINT DF_MyTable_MyColumn
        DEFAULT (NEWSEQUENTIALID())

Bu atomik olarak üç şey yapar: 1. NULLDeğerlere izin vermeyen bir sütun ekleyin ; 2. Sütun için varsayılan bir kısıtlama oluşturun; 3. Varsayılan kısıtlamayı kullanarak tablodaki her satırı doldurun.

Bu örnek bir uniqueidentifiersütun kullanırken , herhangi bir veri türü ve varsayılan kısıtlamayla da aynı şekilde çalışır.


Yöntem 3: UPDATE deyimi kullanarak doldurma

Bu durum, örneğin, uygulamanızın başka bir bölümünden tabloya eklenmesi gereken bir değer olduğunda veya benzersiz değerler için kesin bir sipariş belirtmeniz gerektiğinde ortaya çıkar.

BEGIN TRANSACTION

    ALTER TABLE MyTable ADD MyColumn int NULL

    UPDATE MyTable
        SET MyColumn = ...

    ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL

COMMIT TRANSACTION

Yöntem 4: Bir SEQUENCE nesnesi kullanarak doldurma

SQL Server 2012 için, bir SEQUENCEnesne tarafından oluşturulan değerleri kullanarak bir sütun doldurabilirsiniz - Bu konuda henüz çalışmadım, bu yüzden tamlık için bir MSDN makalesine başvuracağım .


Hepinize teşekkür ederim, yöntem 3'ü ilk cevapla birlikte kullandım: güncelleme T set cn = rn from (select cn, row_number () over (order 1 (select by)) rn olarak TableX'ten) T
med_alpa

Sekans kullanma örneği (mysequence adı verilen bir sekansınız olduğu varsayılarak):update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono

14

1'den başlayan bir sayıdan memnunsanız kullanabilirsiniz row_number().

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


0

bir dizi kullanarak güncellemek için bunu deneyin ... Güncelleştirme deyiminde yan tümce tümce nedeniyle TOP yapmak zorunda. Bu ifadeyi SQL SERVER 2012'de kullandım

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

Ve tüm bunlar hala işe yaramazsa (belki de eski SQL-92 olduğu için), burada Ziggy Crueltyfree Zeitgeister tarafından önerildiği gibi bunu birden fazla adıma ayırabilirsiniz .

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;

Bu RecordNumbernedir? Özel bir Filemaker işlevi / özelliği gibi görünüyor. SQL Server için geçerli değildir ve SQL 92 standardında geçerli değildir.
ypercubeᵀᴹ

Evet haklısın. RecordNumber, Filemaker'da tanımlayabileceğiniz, ekranda görüntülendiğinde ve sıralandıktan sonra (Filemaker tarafından) her satırın kayıt numarasını tutan hesaplanmış bir sütundur.
Gary Czychi

Tamam, güzel, bilmiyordum. Ancak buradaki soru ile etiketlenmediğinden Filemakercevabın alakalı olduğunu düşünmüyorum. Bir geçici tablo kullanabilir ve bu sütunu ROW_NUMBER()işlevle doldurabilirsiniz .
ypercubeᵀᴹ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.