2012-07-20 14 views
7

Le colonne di incremento automatico in SQL Server vengono popolate automaticamente; è possibile definire una colonna UniqueIdentifier per auto-generare su insert senza l'uso di un trigger?È possibile definire una nuova colonna in una tabella di SQL Server che genera automaticamente identificatori univoci per nuove righe?

Questa sarà una chiave univoca secondaria sul tavolo. Devo crearlo perché ora abbiamo bisogno di una chiave primaria pubblica che possa essere utilizzata all'interno di una stringa di query.

L'infrastruttura legacy si basa ancora sulla vecchia chiave primaria int. Dato che la vecchia infrastruttura crea il record in primo luogo, vorrei che SQL Server creasse in modo trasparente la chiave GUID secondaria inserita, se possibile.

Molte grazie

risposta

13

È possibile utilizzare una colonna con tipo Uniqueidentifier con valore predefinito di NEWID()

+9

O meglio ancora: un default di 'NEWSEQUENTIALID()' per ridurre la frammentazione dei vostri indici .... –

+0

Ho già provato ALTER TABLE ADD dbo.tblUser \t Guid uniqueidentifier predefinito Null newid () È questo che intendevi? – krisdyson

+0

Oh scusa, l'ho provato in SSMS e la query non è andata a buon fine, ma quando funziona sul backend funziona. Mio male, grazie! – krisdyson

3

Se si aggiunge una colonna alla tabella il valore predefinito è NEWID() e quindi aggiornare righe esistenti a avere un nuovo id anche. Si può 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 
Problemi correlati