Respuestas:
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()
.
update T
set cn = rn
from (
select cn,
row_number() over(order by (select 1)) as rn
from TableX
) T
La siguiente columna de actualizaciones 'cn' con número de secuencia a partir de 1
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
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)
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;
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 con ROW_NUMBER()
función.