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.
fuente
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.
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 NULL
valores; 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 uniqueidentifier
columna, 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 SEQUENCE
objeto; todavía no he trabajado con esto, por lo que me referiré a un artículo de MSDN para completarlo.
update mytable set mycolumn = next value for mysequence where mycolumn is null;
Si está satisfecho con un número que comienza en 1, puede usarlo
row_number()
.fuente
La siguiente columna de actualizaciones 'cn' con número de secuencia a partir de 1
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
fuente
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
fuente
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í .
fuente
RecordNumber
? Parece una función / característica propietaria de Filemaker. No se aplica a SQL Server y no en el estándar SQL 92.Filemaker
así que no creo que la respuesta sea relevante. Sin embargo, podría usar una tabla temporal y llenar esa columna conROW_NUMBER()
función.