2009-08-26 71 views
213

Tengo el siguiente error cuando ejecuto el siguiente script. ¿Cuál es el error y cómo se puede resolver?No se puede insertar el valor explícito para la columna de identidad en la tabla 'tabla' cuando IDENTITY_INSERT está establecido en OFF

Insert table(OperationID,OpDescription,FilterID) 
values (20,'Hierachy Update',1) 

de error:

Server: Msg 544, Level 16, State 1, Line 1

Cannot insert explicit value for identity column in table 'table' when IDENTITY_INSERT is set to OFF.

Respuesta

318

vas a insertar valores para OperationId que es una columna de identidad .

Puede activar la inserción de identidad en la tabla de esta manera para que pueda especificar sus propios valores de identidad.

SET IDENTITY_INSERT Table1 ON 

INSERT INTO Table1 
/*Note the column list is REQUIRED here, not optional*/ 
      (OperationID, 
      OpDescription, 
      FilterID) 
VALUES  (20, 
      'Hierachy Update', 
      1) 

SET IDENTITY_INSERT Table1 OFF 
+9

+1 exactamente - a su vez la opción de permitir inserciones explícitas ** ** EN, a continuación, insertar, a continuación, gire el opción ** DESACTIVAR ** nuevamente –

+10

Si realmente desea agregar su valor a la columna de identidad, esta es su respuesta, pero, por otro lado, alguien ha establecido que la columna se incremente por sí misma al insertar. En ese caso, la tabla hará un seguimiento del próximo número gratuito, y no es necesario que genere el ID de la operación usted mismo. El ID nuevo puede ser recuperado por SELECT SCOPE_IDENTITY(). –

+9

Práctica peligrosa, no recomiendo usarla sin advertencias para explicar por qué es una mala idea. Muy mala respuesta. – HLGEM

28

no le asigne valor a OperationID porque se generará automáticamente. intente esto:

Insert table(OpDescription,FilterID) values ('Hierachy Update',1) 
+3

esta es la respuesta correcta si desea automáticamente generado OperationID – stom

35

Tenga mucho cuidado de configurar IDENTITY_INSERT en ON. Esta es una práctica deficiente a menos que la base de datos esté en modo de mantenimiento y configurada para usuario único. Esto afecta no solo a su inserción, sino a la de cualquier otra persona que intente acceder a la tabla.

¿Por qué intentas poner un valor en un campo de identidad?

+2

Afecta de qué manera? Esta es una opción de nivel de sesión que no es una propiedad de la tabla. –

+4

Sincronización de datos de una sola vez entre dos bases de datos que desea mantener relaciones. Por ejemplo, lo utilicé para extraer mi esquema de producto de una base de datos a otra – NSjonas

+1

@NSjonas, que sería un buen uso del conjunto Identity _insert table1 ON. He visto personas que querían usar esto para hacer algo de la aplicación que debería hacerse con un simple inserto y permitir que se genere la identidad. – HLGEM

3

Si está utilizando liquibase para actualizar su SQL Server, es probable que intente insertar una clave de registro en un campo de autoIncrement. Al eliminar la columna de la inserción, su secuencia de comandos debería ejecutarse.

<changeSet id="CREATE_GROUP_TABLE" > 
    <createTable tableName="GROUP_D"> 
     <column name="GROUP_ID" type="INTEGER" autoIncrement="true"> 
      <constraints primaryKey="true"/> 
     </column> 
    </createTable> 
</changeSet> 

<changeSet id="INSERT_UNKNOWN_GROUP" > 
    <insert tableName="GROUP_D">  

     <column name="GROUP_ID" valueNumeric="-1"/> 
... 
    </insert> 
</changeSet> 
0

Y si está utilizando Oracle SQL Developer para conectar, recuerde agregar/sqldev: sentencia/

/sqldev: sentencia/SET_IDENTITY_INSERT TABLE en;

+0

Claramente este no es el caso, la pregunta tiene una etiqueta "sql-server" – DanielV

2

Bueno, resolví el mío bastante fácil, compruebe que su clave principal sea del mismo nombre con sus clases, donde la única diferencia es que su clave principal tiene 'ID' adjunta o especifica [clave] en claves principales que no son relacionado a cómo se nombra la clase.

3

No es pre-mencionado OperationId en su consulta que no deberían estar allí, ya que es automático increamented

Insert table(OperationID,OpDescription,FilterID) 
values (20,'Hierachy Update',1) 

por lo que su consulta será

Insert table(OpDescription,FilterID) 
values ('Hierachy Update',1) 
+0

Esta es una respuesta duplicada: http://stackoverflow.com/a/1334043/3541845 – haihui

10

En su entidad para esa tabla, agregue el atributo DatabaseGenerated encima de la columna para la que se establece la inserción de identidad:

Ejemplo:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int TaskId { get; set; } 
+1

Pero esto es para SQL, no para el marco de entidad. – Negarrak

0

no estoy seguro de lo que es el uso de la "Insertar tabla", pero si sólo está tratando de insertar algunos valores tratar:

Insert Into [tablename] (OpDescription,FilterID) 
values ('Hierachy Update',1); 

que tenían el mismo mensaje de error aparecen, pero creo que esto debería funcionar La ID debe autoincrementarse automáticamente siempre que sea una clave principal.

13

Simply If you getting this error on SQL server then run this query-

SET IDENTITY_INSERT tableName ON 

por ejemplo, si el nombre de tabla es estudiante y luego mirar consulta como esta SET IDENTITY_INSERT student ON

If you getting this error on your web application or you using entity framework then first run this query on SQL server and Update your entity model (.edmx file) and build your project and this error will be resolved

-2

El problema que plantea el uso de DBContext no mecanografiada o DBSet si el uso de la interfaz y poner en práctica el método de savechanges de forma genérica

Si este es su caso, propongo a fuertemente tipeado DBContex por ejemplo

MyDBContext.MyEntity.Add(mynewObject) 

continuación .Savechanges funcionará

1

puede simplemente utilizar esta sentencia, por ejemplo, si el nombre de tabla es Escuela. Antes de la inserción hacer identity_insert esté configurado en EN y después de su vez consulta de inserción identity_insert OFF

+1

¿Podría ampliar su respuesta un poco para incluir una explicación del comando, por qué funciona y qué efecto tiene? – gareththegeek

+0

@gareththegeek Sí, es para la columna de identidad que debe asegurarse de activarla para insertar datos. –

Cuestiones relacionadas