2011-05-24 22 views
5

Estoy usando SQL Server 2008 y una clave principal de una tabla de base de datos que estoy usando no es una columna IDENTITY (no estoy seguro por qué). Necesito cambiar eso.Cómo agrego auto_increment a una columna en SQL Server 2008

Estoy en SQL Server Management Studio en la vista de diseño, bajo las propiedades de columna y por alguna razón no puedo cambiar las especificaciones de identidad a Yes.

Hay algo que me falta ... Soy nuevo en SQL Server: ¿alguna idea sobre lo que me falta?

Aquí es el crear la tabla

CREATE TABLE [dbo].[AR_Transactions](
     [Trans_ID] [bigint] NOT NULL, 
     [DateTime] [datetime] NOT NULL, 
     [Cashier_ID] [nvarchar](50) NULL, 
     [CustNum] [nvarchar](12) NOT NULL, 
     [Trans_Type] [nvarchar](2) NOT NULL, 
     [Prev_Cust_Balance] [money] NULL, 
     [Prev_Inv_Balance] [money] NULL, 
     [Trans_Amount] [money] NOT NULL, 
     [Payment_Method] [nvarchar](4) NULL, 
     [Payment_Info] [nvarchar](20) NULL, 
     [Description] [nvarchar](38) NULL, 
     [Invoice_Number] [bigint] NOT NULL, 
     [Store_ID] [nvarchar](10) NOT NULL, 
     [Dirty] [bit] NOT NULL, 
     [Station_ID] [nvarchar](5) NULL, 
     [Payment_Type] [smallint] NULL, 

CONSTRAINT [pkAR_Transactions] 
     PRIMARY KEY CLUSTERED([Store_ID] ASC, [Trans_ID] ASC) 
      WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
       ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

ALTER TABLE [dbo].[AR_Transactions] 
    ADD CONSTRAINT [DF_AR_Transactions_Trans_ID_AR_Transactions] 
    DEFAULT ((0)) FOR [Trans_ID] 

ALTER TABLE [dbo].[AR_Transactions] 
    ADD CONSTRAINT [DF_AR_Transactions_Invoice_Number_AR_Transactions] 
    DEFAULT ((0)) FOR [Invoice_Number] 

Ésta es la consulta que se necesita para ejecutar su ... un corte completo a tratar de incremento automático mis inserciones mismo

BEGIN TRANSACTION 

INSERT INTO 
     [cresql].[dbo].[AR_Transactions](Trans_ID, DateTime , Dirty, Store_ID, Trans_Type, 
      Cashier_ID, CustNum, Trans_Amount, Prev_Cust_Balance) 
     SELECT 
      (SELECT MAX(Trans_ID) + 1 FROM [cresql].[dbo].[AR_Transactions]), 
      DATEADD(MINUTE, -30, Getdate()), 1, 1001, 'C', 100199, CustNum, 
      -Acct_Balance, Acct_Balance 
    FROM [cresql].[dbo].[Customer] 
     WHERE Acct_Balance <> 0 

UPDATE [cresql].[dbo].[Customer] 
    SET Acct_Balance = 0 
WHERE Acct_Balance <> 0 

COMMIT TRANSACTION 
+0

¿Qué quiere decir con que no se puede cambiar. ¿Te da un error? ¿Está gris? –

+0

Este es el problema de si la identidad está en gris a no y no puedo cambiarlo – Trace

+0

En una nota al margen: nunca * llamaría * a una columna algo así como '[DateTime]' ..... y también recomendaría * no * haciendo columnas de longitud inferior a 5 'varchar' o' nvarchar' - la sobrecarga de 2 bytes te está matando. Si la columna tiene 5 caracteres o menos, hágalo 'CHAR (x)' o 'NCHAR (x)'. Y estoy seguro de que su método actual de aumentar el 'Trans_ID' no es seguro en un entorno ocupado y tarde o temprano llevará a valores' Trans_ID' duplicados .... –

Respuesta

5

Es necesario para expandir el nodo "Especificación de identidad" para cambiarlo a través de la propiedad (Is Identity).

Esto reconstruirá la tabla, por lo que también podría necesitar ingresar al Tools -> Options -> Designers -> Prevent saving changes that require table re-creation.

Esto puede ser una operación que consume mucho tiempo en tablas grandes y que implica mucho registro y bloqueo. Para realizar esta operación en una tabla grande see my answer here.

+0

+1 es un poco complicado y no muy intuitivo al principio, simplemente haciendo clic en la línea "Especificación de identidad" no hace nada, primero hay que expandirlo y luego se pueden hacer cambios ... –

+0

Este es el problema ¿La identidad está atenuada a no y no puedo cambiarla? – Trace

+0

@Tamer - ¿Cuál es el tipo de datos de la columna? –

1

No puede usar ALTER TABLE ... ALTER COLUMN para modificar una columna para que tenga una propiedad de identidad. Necesitará

  • soltar la restricción de clave primaria y cualquier restricción de clave externa que haga referencia a la columna en cuestión en su tabla.
  • agregue una nueva columna con la propiedad identity. Debería tener el mismo tipo (int, supongo) como la columna existente.
  • actualice la tabla para inicializar la nueva columna con los valores de la columna existente.
  • modifique la nueva columna para que no sea nulable.
  • soltar la columna anterior/existente.
  • cambie el nombre de la nueva columna para que su nombre sea el mismo que el de la columna anterior.
  • Recrear la clave principal y las referencias de clave externa que eliminó en el primer paso.

¡Simple! O algo.

+1

[Hay una manera de hacer esto como un cambio de metadatos solamente] (http://stackoverflow.com/questions/5181304/set-identity-on-the-column/6094907#6094907) (Por cierto, las columnas 'identity' no son actualizable de modo que el paso 3 no se puede hacer en su plan de todos modos) –

+0

@Las columnas de identidad de Martin pueden de hecho actualizarse en un proceso de conversión usando Set Identity_insert ON – HLGEM

+1

'set identity_insert on' permite la ** inserción ** de filas con una columna valor en columnas de identidad; no permite la ** actualización ** del valor de la columna de identidad de las filas existentes. –

11

Para ilustrar el punto de Martín:

enter image description here

Y PS: - como Mikael Eriksson razón menciona (y documentos agradable), esta Especificación Identidad permanece en gris tan larga como la columna que' ReTrabajo tiene una restricción predeterminada.

+0

Este es el problema de si la identidad está atenuada a no y no puedo cambiarla – Trace

+2

Exactamente mi punto: no se puede agregar una propiedad de identidad a una columna después del hecho. Tampoco puedes deshacerte de él sin dejar caer la columna. La propiedad de identificación ** debe ** definirse cuando se crea la columna. De ahí el tango de 7 pasos en mi respuesta a continuación. –

5

Primero, elimine la restricción predeterminada de la columna Trans_ID. Luego puede establecer Is Identity en Sí en el diseñador.

Propiedades de la columna Trans_ID en su tabla AR_Transacciones. (Is Identity) está desactivado:

enter image description here

Retire la restricción predeterminada y (Is Identity) ya no está incapacitada:

enter image description here

establece en Sí y guardar. Default Value or Binding no está habilitado en su lugar:

enter image description here

+2

+1 se lo clavaron en la cabeza, no estoy seguro de por qué alguien podría ** rechazar ** esta respuesta absolutamente puntual ..... –

+0

+1 ¡Eso parece explicar las cosas! –

0
CREATE TABLE [dbo].[AR_Transactions](
     [Trans_ID] [bigint] IDENTITY(1,1) NOT NULL, 
     [DateTime] [datetime] NOT NULL, 
     [Cashier_ID] [nvarchar](50) NULL, 
     [CustNum] [nvarchar](12) NOT NULL, 
     [Trans_Type] [nvarchar](2) NOT NULL, 
     [Prev_Cust_Balance] [money] NULL, 
     [Prev_Inv_Balance] [money] NULL, 
     [Trans_Amount] [money] NOT NULL, 
     [Payment_Method] [nvarchar](4) NULL, 
     [Payment_Info] [nvarchar](20) NULL, 
     [Description] [nvarchar](38) NULL, 
     [Invoice_Number] [bigint] NOT NULL, 
     [Store_ID] [nvarchar](10) NOT NULL, 
     [Dirty] [bit] NOT NULL, 
     [Station_ID] [nvarchar](5) NULL, 
     [Payment_Type] [smallint] NULL, 

CONSTRAINT [pkAR_Transactions] 
     PRIMARY KEY CLUSTERED([Store_ID] ASC, [Trans_ID] ASC) 
      WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
       ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

ALTER TABLE [dbo].[AR_Transactions] 
    ADD CONSTRAINT [DF_AR_Transactions_Trans_ID_AR_Transactions] 
    DEFAULT ((0)) FOR [Trans_ID] 

ALTER TABLE [dbo].[AR_Transactions] 
    ADD CONSTRAINT [DF_AR_Transactions_Invoice_Number_AR_Transactions] 
    DEFAULT ((0)) FOR [Invoice_Number] 
Cuestiones relacionadas