sql - tabla - no se puede insertar una columna de identidad siempre generada
No se puede insertar un valor explícito para la columna de identidad en la tabla ''tabla'' cuando IDENTITY_INSERT está desactivado (13)
Tengo el siguiente error cuando ejecuto el siguiente script. ¿De qué se trata el error y cómo puede resolverse?
Insert table(OperationID,OpDescription,FilterID)
values (20,''Hierachy Update'',1)
Error:
Servidor: Msg 544, nivel 16, estado 1, línea 1
No se puede insertar un valor explícito para la columna de identidad en la tabla "tabla" cuando IDENTITY_INSERT está desactivado.
Simplemente, si obtiene este error en el servidor SQL, ejecute esta consulta.
SET IDENTITY_INSERT tableName ON
por ejemplo, si el nombre de la tabla es estudiante, la consulta se verá así: SET IDENTITY_INSERT student ON
Si obtiene este error en su aplicación web o utiliza el marco de la entidad, primero ejecute esta consulta en el servidor SQL y actualice su modelo de entidad (
.edmx file
) y.edmx file
su proyecto y este error se resolverá
Básicamente hay 2 formas diferentes de INSERTAR registros sin tener un error:
1) Cuando el IDENTITY_INSERT está desactivado. LA CLAVE PRINCIPAL "ID" NO DEBE ESTAR PRESENTE
2) Cuando el IDENTITY_INSERT está activado. LA CLAVE PRIMARIA "ID" DEBE ESTAR PRESENTE
Según el siguiente ejemplo de la misma tabla creada con una CLAVE PRIMARIA DE IDENTIDAD:
CREATE TABLE [dbo].[Persons] (
ID INT IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(40) NOT NULL,
FirstName VARCHAR(40)
);
1) En el primer ejemplo, puede insertar nuevos registros en la tabla sin obtener un error cuando IDENTITY_INSERT está DESACTIVADO. La "ID" CLAVE PRINCIPAL NO DEBE ESTAR PRESENTE de las declaraciones "INSERT INTO" y se agregará automáticamente un valor de ID único:. Si la identificación está presente desde INSERT en este caso, aparecerá el error "No se puede insertar un valor explícito para identificar la columna en la tabla ..."
SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES (''JANE'',''DOE'');
INSERT INTO Persons (FirstName,LastName)
VALUES (''JOE'',''BROWN'');
SALIDA de la TABLA [dbo]. [Personas] será:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
2) En el segundo ejemplo, puede insertar nuevos registros en la tabla sin obtener un error cuando IDENTITY_INSERT está ENCENDIDO. La "ID" CLAVE PRINCIPAL DEBE ESTAR PRESENTE de las declaraciones "INSERT INTO" siempre que el valor de la ID no exista : Si la ID NO está presente en el INSERT en este caso, aparecerá el error "El valor explícito debe ser especificado para la tabla de columnas de identidad ... "
SET IDENTITY_INSERT [dbo].[Persons] ON;
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (5,''JOHN'',''WHITE'');
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (3,''JACK'',''BLACK'');
SALIDA de la TABLA [dbo]. [Personas] será:
ID LastName FirstName
1 DOE Jane
2 BROWN JOE
3 BLACK JACK
5 WHITE JOHN
Bueno, resolví la mía con bastante facilidad. Verifique que su clave principal tenga el mismo nombre que sus clases, donde la única diferencia es que su clave principal tiene una ''ID'' adjunta o especifique [Clave] en las claves principales que no están relacionadas con la forma en que se nombra clase
El problema provocado por el uso de DBContext o DBSet no tipificados si utiliza la Interfaz e implementa el método de savechanges de una manera genérica
Si este es su caso, le propongo a DBContex fuertemente tipado, por ejemplo.
MyDBContext.MyEntity.Add(mynewObject)
entonces .Savechanges
funcionará
En su entidad para esa tabla, agregue el atributo DatabaseGenerated
encima de la columna para la cual se establece la inserción de identidad:
Ejemplo:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskId { get; set; }
Estás insertando 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
Hay un OperationId mencionado previamente en su consulta que no debería estar allí, ya que se crea automáticamente
Insert table(OperationID,OpDescription,FilterID)
values (20,''Hierachy Update'',1)
por lo que su consulta será
Insert table(OpDescription,FilterID)
values (''Hierachy Update'',1)
No estoy seguro de cuál es el uso de "Insertar tabla", pero si solo está intentando insertar algunos valores, intente:
Insert Into [tablename] (OpDescription,FilterID)
values (''Hierachy Update'',1);
Recibí el mismo mensaje de error, pero creo que esto debería funcionar. La ID debería incrementarse automáticamente siempre que sea una clave principal.
Si está utilizando liquibase para actualizar su servidor SQL, es probable que esté intentando insertar una clave de registro en un campo de autoincremento. Al eliminar la columna de la inserción, su script 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>
Tenga mucho cuidado al configurar IDENTITY_INSERT en ON. Esta es una mala práctica a menos que la base de datos esté en modo de mantenimiento y configurada para un solo usuario. Esto afecta no solo a su inserción, sino a las de cualquier otra persona que intente acceder a la tabla.
¿Por qué estás tratando de poner un valor en un campo de identidad?
Y si está utilizando Oracle SQL Developer para conectarse, recuerde agregar / sqldev: stmt /
/ sqldev: stmt / set identity_insert TABLE on;
no ponga valor a OperationID porque se generará automáticamente. prueba esto:
Insert table(OpDescription,FilterID) values (''Hierachy Update'',1)
simplemente puede usar esta declaración, por ejemplo, si el nombre de su tabla es Escuela . Antes de la inserción, asegúrese de que identity_insert esté en ON y después de insertar la consulta, apague identity_insert en OFF
SET IDENTITY_INSERT School ON
/*
insert query
enter code here
*/
SET IDENTITY_INSERT School OFF