Actualice las filas existentes con número de secuencia / char o cualquier dato único


13

Agregué una nueva columna en la Tabla X

Esta columna "cn" tiene que ser única y obligatoria, pero los datos antiguos no tienen ningún valor.

¿Cómo actualizar los registros existentes con datos únicos secuenciales o aleatorios?

Gracias.

Respuestas:


11

Aunque creo que ya ha creado la columna, en esta respuesta supongo que la columna aún no existe. En mi opinión, nunca se debe agregar una columna obligatoria única sin planificar primero cómo llenar las filas existentes. Por lo tanto, proporcionaré los métodos para hacerlo a partir de cero.


La forma de hacerlo depende de lo que esté involucrado en completar los valores.

Después del método que utilice, agregue una restricción única en la columna para garantizar la integridad de los datos. Para los Métodos 1 y 2, esto puede hacerse dentro de la declaración única o dentro de una transacción de usuario (no se muestra), y debe hacerse dentro de la transacción del usuario en el Método 3.

Probablemente hay algunas otras formas oscuras de hacer esto, pero creo que he cubierto las más comunes.


Método 1: agregar una columna IDENTIDAD

ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL

Esto completará todas las filas de la tabla con valores enteros que comiencen con el valor de inicialización (1), aumentando en el valor de incremento (2) para cada fila. Creo que el orden en que se llenan los valores no está definido (si tiene que especificar un orden, use el Método 3).


Método 2: rellene utilizando una restricción predeterminada

ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
    CONSTRAINT DF_MyTable_MyColumn
        DEFAULT (NEWSEQUENTIALID())

Esto hará tres cosas atómicamente: 1. Agregue una columna que no permita NULLvalores; 2. Cree una restricción predeterminada para la columna; 3. Rellene cada fila de la tabla utilizando la restricción predeterminada.

Si bien este ejemplo usa una uniqueidentifiercolumna, funciona igual de bien con cualquier tipo de datos y restricción predeterminada.


Método 3: llenar con una instrucción UPDATE

Este caso ocurriría cuando, por ejemplo, hubo un valor de otra parte de su aplicación que debe agregarse a la tabla, o si necesita especificar un orden exacto para los valores únicos.

BEGIN TRANSACTION

    ALTER TABLE MyTable ADD MyColumn int NULL

    UPDATE MyTable
        SET MyColumn = ...

    ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL

COMMIT TRANSACTION

Método 4: llenar con un objeto SECUENCIA

Para SQL Server 2012, puede completar una columna con los valores generados por un SEQUENCEobjeto; todavía no he trabajado con esto, por lo que me referiré a un artículo de MSDN para completarlo.


Gracias a todos, utilicé el método 3 con una combinación con la primera respuesta: actualizar T set cn = rn from (select cn, row_number () over (order by (select 1)) as rn from TableX) T
med_alpa

Ejemplo de uso de secuencia (suponiendo que tenga una secuencia llamada mysequence):update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono

14

Si está satisfecho con un número que comienza en 1, puede usarlo row_number().

update T
set cn = rn
from (
       select cn,
              row_number() over(order by (select 1)) as rn
       from TableX
     ) T


0

intente esto para actualizar usando una secuencia ... Debe hacer el TOP debido al orden por cláusula en la declaración de actualización. Usé esta declaración en 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

Y si todo esto aún no funciona (tal vez porque es simplemente el viejo SQL-92), puede dividir esto en varios pasos, como lo sugiere Ziggy Crueltyfree Zeitgeister, aquí .

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;

¿Qué es esto RecordNumber? Parece una función / característica propietaria de Filemaker. No se aplica a SQL Server y no en el estándar SQL 92.
ypercubeᵀᴹ

Sí tienes razón. RecordNumber es una columna calculada que puede definir en Filemaker, que contiene el número de registro de cada fila cuando se muestra en la pantalla y después de que se ordena (por Filemaker).
Gary Czychi

OK, bien, no lo sabía. Pero la pregunta aquí no está etiquetada, Filemakerasí que no creo que la respuesta sea relevante. Sin embargo, podría usar una tabla temporal y llenar esa columna con ROW_NUMBER()función.
ypercubeᵀᴹ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.