Yanıtlar:
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 .
update mytable set mycolumn = next value for mysequence where mycolumn is null;
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
Aşağıdaki güncellemeler sütunu 'cn' 1'den başlayarak sıra numarası ile
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
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)
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;
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.
Filemakercevabın alakalı olduğunu düşünmüyorum. Bir geçici tablo kullanabilir ve bu sütunu ROW_NUMBER()işlevle doldurabilirsiniz .