Оновіть наявні рядки за допомогою номера / знаку чи знаку чи будь-яких унікальних даних


13

Я додав новий стовпчик у таблицю X

Цей стовпець "cn" повинен бути унікальним і обов'язковим, але старі дані не мають жодного значення.

Як оновити існуючі записи послідовно або випадковими унікальними даними?

Дякую.

Відповіді:


11

Хоча я думаю, що ви вже створили стовпець, у цій відповіді я продовжую припускати, що стовпець ще не існує. 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 .


Дякую всім, я використав метод 3 з комбінацією з першою відповіддю: оновлення T set cn = rn from (виберіть cn, row_number () над (упорядкувати по (select 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

спробуйте це оновити, використовуючи послідовність ... Ви повинні зробити 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)

-1

І якщо все це все-таки не вийде (можливо, тому що це звичайний старий 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.
ypercubeᵀᴹ

Так, ви праві. RecordNumber - це обчислений стовпець, який ви можете визначити у Filemaker, який містить номер запису кожного рядка, коли він відображається на екрані та після його сортування (за допомогою Filemaker).
Gary Czychi

Гаразд, добре, не знав цього. Але питання тут не позначене, Filemakerтому я не думаю, що відповідь є актуальною. Ви можете використовувати таблицю темпів та заповнити цей стовпець ROW_NUMBER()функцією.
ypercubeᵀᴹ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.