2012-07-20 10 views
7

Las columnas de incremento automático en SQL Server se completan automáticamente; ¿Es posible definir una columna UniqueIdentifier para autogenerar en insert sin el uso de un disparador?¿Puede definir una nueva columna en una tabla de SQL Server que genera automáticamente Identificadores únicos para nuevas filas?

Esta será una clave única secundaria en la tabla. Necesito crearlo porque ahora necesitamos una clave pública primaria que se pueda usar dentro de una cadena de consulta.

La infraestructura heredada aún se basa en la antigua clave primaria int. Dado que la infraestructura anterior crea el registro en primer lugar, me gustaría que SQL Server cree de forma transparente la clave GUID secundaria en la inserción, si es posible.

Muchas gracias

Respuesta

13

Se puede utilizar una columna con el tipo Uniqueidentifier con valor por defecto de NEWID()

+9

O mejor aún: un defecto de 'NEWSEQUENTIALID()' para reducir la fragmentación de los índices .... –

+0

Ya he probado ALTER TABLE ADD dbo.tblUser \t Guid newid uniqueidentifier DEFAULT NULL () ¿Es esto lo que querías decir? – krisdyson

+0

Oh, lo siento, lo probé en SSMS y la consulta falló, pero cuando funciona en el backend funciona. Mi mal, gracias! – krisdyson

3

Si se agrega una columna a la tabla con un valor predeterminado de NEWID() y luego actualiza las filas existentes a tener una nueva identificación también Es posible que wa

-- Create test table 
CREATE TABLE Test1 
(
ID int IDENTITY(1,1) 
,Txt char(1) 
); 

-- Insert data 
INSERT INTO Test1(Txt) 
SELECT 'a' UNION ALL 
SELECT 'b' UNION ALL 
SELECT 'c' UNION ALL 
SELECT 'd' UNION ALL 
SELECT 'e'; 

-- Add column 
ALTER TABLE Test1 
ADD GlobalID uniqueidentifier DEFAULT(NEWID()); 

-- View table, default value not added for existing rows 
SELECT * 
FROM Test1; 

-- Update null ids with guids 
UPDATE Test1 
SET GlobalID = NEWID() 
WHERE GlobalID IS NULL 

-- Insert new data 
INSERT INTO Test1(Txt) 
SELECT 'f' UNION ALL 
SELECT 'g' UNION ALL 
SELECT 'h' UNION ALL 
SELECT 'i' UNION ALL 
SELECT 'j'; 

-- View table 
SELECT * 
FROM Test1; 

-- Drop table 
DROP TABLE Test1 
Cuestiones relacionadas