Ответы:
Хотя я думаю, что вы уже создали столбец, в этом ответе я предполагаю, что столбец еще не существует. IMO, уникальный обязательный столбец никогда не должен добавляться без планирования, как сначала заполнить существующие строки. Поэтому я предоставлю методы для этого, начиная с нуля.
Как вы это сделаете, зависит от того, что входит в заполнение значений.
После того, какой метод вы используете, добавьте уникальное ограничение на столбец, чтобы обеспечить целостность данных. Для методов 1 и 2 это может быть сделано в пределах одного оператора или в пользовательской транзакции (не показана), и должно быть сделано в пользовательской транзакции в методе 3.
Вероятно, есть несколько других неясных способов сделать это, но я думаю, что я рассмотрел наиболее распространенные.
Способ 1: добавить столбец IDENTITY
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
попробуйте это обновить, используя последовательность ... Вы должны сделать ТОП из-за предложения order by в операторе обновления. Я использовал это утверждение на 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), вы можете разбить его на несколько этапов, как предлагает Зигги 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()
функцией.