Обновите существующие строки с помощью порядкового номера / символа или любых уникальных данных

13

Я добавил новый столбец в таблице X

Этот столбец «cn» должен быть уникальным и обязательным, но старые данные не имеют никакого значения.

Как обновить существующие записи случайными или случайными уникальными данными?

Спасибо.

med_alpa
источник

Ответы:

11

Хотя я думаю, что вы уже создали столбец, в этом ответе я предполагаю, что столбец еще не существует. 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 для полноты.

Джон Сайгель
источник
Спасибо всем, я использовал метод 3 с комбинацией с первым ответом: обновить T установить cn = rn из (выберите cn, row_number () over (упорядочить (выбрать 1)) как rn из TableX) T
med_alpa
Пример использования последовательности (при условии, что у вас есть последовательность, называемая mysequence):update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono
14

Если вас устраивает число, начинающееся с 1, вы можете использовать row_number().

update T
set cn = rn
from (
       select cn,
              row_number() over(order by (select 1)) as rn
       from TableX
     ) T
Микаэль Эрикссон
источник
0

попробуйте это обновить, используя последовательность ... Вы должны сделать ТОП из-за предложения 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)
hewstone
источник
-1

И если все это по-прежнему не сработает (возможно, потому что это старый 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.
ypercubeᵀᴹ
Да, ты прав. RecordNumber - это вычисляемый столбец, который можно определить в Filemaker, который содержит номер записи каждой строки, когда она отображается на экране и после ее сортировки (Filemaker).
Гэри Чичи
Хорошо, хорошо, не знал этого. Но вопрос здесь не помечен, Filemakerпоэтому я не думаю, что ответ уместен. Вы можете использовать временную таблицу и заполнить этот столбец ROW_NUMBER()функцией.
ypercubeᵀᴹ