2008-12-08 54 views

Respuesta

27
CREATE TABLE [dbo].[Foo](
    [FooId] [int] IDENTITY(1,1) NOT NULL, 
    [BarId] [int] IDENTITY(1,1) NOT NULL 
) 

vuelve

Msg 2744, Level 16, State 2, Line 1 
Multiple identity columns specified for table 'Foo'. Only one identity column per table is allowed. 

Así que no, no se puede tener dos columnas de identidad. Por supuesto, puede hacer que la clave principal no aumente automáticamente (identidad).

Editar: msdn:CREATE TABLE (Transact-SQL) y CREATE TABLE (SQL Server 2000):

Sólo una columna de identidad pueden ser creados por mesa.

+1

Intenté esto pero a menudo se puede cambiar una configuración y por eso hice la pregunta. –

+0

Es por especificación. Ver el enlace agregado a msdn. –

0

en el servidor sql no es posible tener más de una columna como identidad.

1

La clave principal no necesita ser una columna de identidad.

No puede tener dos columnas Identity.

Usted podría conseguir algo parecido a lo que quiere con un gatillo ...

+0

Esto es problemático. Una clave principal no permite valores nulos. Por lo general, las claves generadas automáticamente se omiten en las inserciones. Incluso si usa un desencadenador con INSTEAD OF INSERT para generar su clave primaria vomitará (Probado en SQLSEVER2000) –

+1

@snmcdonald: No use SQL Server 2000 en 2011 year. – abatishchev

5

Añadir una columna de identidad y luego agregar una columna calculada cuya fórmula es el nombre de la columna de identidad

Ahora ambos se incrementará al mismo tiempo

3

No, no es posible tener más de una columna de identidad.

Enterprise Manager ni siquiera le permite configurar> 1 columna como identidad. Cuando se crea una segunda columna identidad

También tenga en cuenta que @@ identity devuelve el último valor de identidad para la conexión abierta que no tendría sentido si más de una columna de identidad fuera posible para una tabla. columna de identidad

2
create table #tblStudent 
(
    ID int primary key identity(1,1), 
    Number UNIQUEIDENTIFIER DEFAULT NEWID(), 
    Name nvarchar(50) 
) 

Dos no es posible, pero si acepta usar una columna de identificador único, entonces este código hace el mismo trabajo también. Y también necesita una columna adicional - Columna de nombre - para insertar valores.

Ejemplo de uso:

insert into #tblStudent(Name) values('Ali') 

select * from #tblStudent 

Sal: NewID() función crea un valor único de tipo uniqueidentifier.

0

Acabo de crear un código que le permitirá insertar dos identidades en la misma tabla.permítanme compartir con usted en caso de que ayuda:

create trigger UpdateSecondTableIdentity 
On TableName For INSERT 
as 
update TableName 
set SecondIdentityColumn = [email protected]@IDENTITY 
where ForstId = @@IDENTITY; 

Gracias,

16

Puede utilizar Secuencia de la segunda columna con el valor por defecto si se utiliza SQL Server 2012

--Create the Test schema 
CREATE SCHEMA Test ; 
GO 

-- Create a sequence 
CREATE SEQUENCE Test.SORT_ID_seq 
    START WITH 1 
    INCREMENT BY 1 ; 
GO 

-- Create a table 
CREATE TABLE Test.Foo 
    (PK_ID int IDENTITY (1,1) PRIMARY KEY, 
    SORT_ID int not null DEFAULT (NEXT VALUE FOR Test.SORT_ID_seq)); 
GO 

INSERT INTO Test.Foo VALUES (DEFAULT) 
INSERT INTO Test.Foo VALUES (DEFAULT) 
INSERT INTO Test.Foo VALUES (DEFAULT) 

SELECT * FROM Test.Foo 

-- Cleanup 
--DROP TABLE Test.Foo 
--DROP SEQUENCE Test.SORT_ID_seq 
--DROP SCHEMA Test 

http://technet.microsoft.com/en-us/library/ff878058.aspx

+0

Buena sugerencia, el único problema es el truncamiento de la tabla. – GoldBishop

+0

No estoy seguro de que Truncation sea un problema, si desea [restablecer secuencia] (https://msdn.microsoft.com/en-us/library/ff878572.aspx#code-snippet-7), puede Haga fácilmente eso – benkevich

+0

Sí, pero a diferencia del identificador de identidad, tiene que soltar la secuencia y luego volver a agregar o ir y redefinir el inicio de la secuencia. Para desarrollo y/o prueba, Sequence no es una implementación ideal. Una vez que superas la etapa de desarrollo/prueba, es una implementación enormemente útil. Solo un PITA durante las etapas dev – GoldBishop

-1

Una solución alternativa sería crear un desencadenador INSERT que incremente un contador.

Así que tengo una tabla que tiene una col de identidad: applicationstatusid. también es la clave principal. Quiero aumentar automáticamente otra columna: número de aplicación

Así que este es el disparador que escribo.

create trigger [applicationstatus_insert] on [ApplicationStatus] after insert as 
     update [Applicationstatus] 
     set [Applicationstatus].applicationnumber =(applicationstatusid+ 4000000) 
     from [Applicationstatus] 
     inner join inserted on [applicationstatus].applicationstatusid = inserted.applicationstatusid 
+0

CREAR La siguiente secuencia le permite hacer un valor predeterminado que se autoincrede. Antes de 2012, podría usar una función que incremente un valor en una tabla y lo devuelva (similar a lo que ha hecho en su respuesta). Y ese podría ser un valor predeterminado para una columna. Los desencadenantes deben ser evitados. – TamusJRoyce

Cuestiones relacionadas