Відповіді:
Хоча я думаю, що ви вже створили стовпець, у цій відповіді я продовжую припускати, що стовпець ще не існує. IMO, унікальний необхідний стовпець ніколи не слід додавати, не плануючи спочатку заповнити існуючі рядки. Тому я надаю методи для цього, починаючи з нуля.
Як це зробити, залежить від того, що бере участь у заповненні значень.
Після того, яким методом ви користуєтесь, додайте унікальне обмеження на стовпчик, щоб забезпечити цілісність даних. Для методів 1 і 2 це можна зробити в межах одного оператора або в межах транзакції користувача (не показано), і це слід зробити в рамках трансакції користувача у Способі 3.
Напевно, існує кілька інших незрозумілих способів зробити це, але я думаю, я висвітлював найпоширеніші.
Спосіб 1: Додайте стовпець ІДЕНТИЧНОСТІ
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())
Це зробить три речі атомно: 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
Наступний оновлений стовпчик 'cn' із порядковим номером, починаючи з 1
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
спробуйте це оновити, використовуючи послідовність ... Ви повинні зробити TOP через порядок вказівки в операторі оновлення. Я використовував цей вислів на 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)
І якщо все це все-таки не вийде (можливо, тому що це звичайний старий 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()функцією.