INSERTAR declaración en conflicto con la restricción FOREIGN KEY - SQL Server


225

Estoy teniendo el siguiente error. ¿Me podría ayudar?

Mensaje 547, Nivel 16, Estado 0, Línea 1
La instrucción INSERT entró en conflicto con la restricción FOREIGN KEY "FK_Sup_Item_Sup_Item_Cat". El conflicto ocurrió en la base de datos "dev_bo", tabla "dbo.Sup_Item_Cat". La instrucción se ha terminado.

Código:

insert into sup_item (supplier_id, sup_item_id, name, sup_item_cat_id, 
                      status_code, last_modified_user_id, last_modified_timestamp, client_id)   
values (10162425, 10, 'jaiso', '123123',
        'a', '12', '2010-12-12', '1062425')

La última columna client_idestá causando el error. Traté de poner el valor que ya existe en dbo.Sup_Item_Catla columna, correspondiente al sup_item .. pero no es alegría :-(


20
Intentó insertar un registro en su tabla de elementos que no tiene un registro de categoría coincidente en su Sup_Item_Cattabla. No hay mucho más que decir al respecto.
Martin Smith

1
¿Entonces estás diciendo que SELECT * FROM Sup_Item_Cat WHERE sup_item_cat_id = '123123'devuelve resultados?
Martin Smith

2
También dices "el último coulum" client_id "Estoy recibiendo el conflicto". Esto no es lo que implica el mensaje de error. Creo que está buscando el problema en el lugar equivocado.
Martin Smith

Respuestas:


287

En su tabla dbo.Sup_Item_Cat, tiene una referencia de clave externa a otra tabla. La forma en que funciona un FK es que no puede tener un valor en esa columna que no esté también en la columna de clave principal de la tabla referenciada.

Si tiene SQL Server Management Studio, ábralo y sp_help' dbo.Sup_Item_Cat'. Vea en qué columna está FK y a qué columna de qué tabla hace referencia. Estás insertando algunos datos incorrectos.

¡Avísame si necesitas algo mejor explicado!


10
¡Gracias por incluir el comando sp_help! Me ayudó a reducir mi problema similar.
Gaʀʀʏ

De hecho, en mi caso, la propiedad simplemente no se devolvía de la vista al controlador, por lo que siempre era 0 (que no era una identificación válida, pero el controlador no tendría forma de saberlo)
neminem

1
Alt + F1 es un acceso directo para sp_help, para lectores futuros, seleccione la tabla y presione alt + f1
satsvelke

133

Tuve este problema yo mismo, con respecto al mensaje de error que se recibe al intentar completar un campo de clave externa. Terminé en esta página con la esperanza de encontrar la respuesta. La respuesta marcada en esta página es de hecho la correcta, desafortunadamente siento que la respuesta es un poco incompleta para las personas que no están tan familiarizadas con SQL. Soy bastante apto para escribir código, pero las consultas SQL son nuevas para mí, así como para construir tablas de bases de datos.

A pesar de que la respuesta marcada es correcta:

Mike M escribió

"La forma en que funciona un FK es que no puede tener un valor en esa columna que no esté también en la columna de clave principal de la tabla referenciada".

Lo que falta en esta respuesta es simplemente;

Primero debe compilar la tabla que contiene la clave primaria.

Otra forma de decirlo es;

Debe insertar datos en la tabla primaria, que contiene la clave primaria, antes de intentar insertar datos en la tabla secundaria que contiene la clave externa.

En resumen, muchos de los tutoriales parecen estar desconcertando este hecho, por lo que si tuviera que intentarlo por su cuenta y no se diera cuenta de que había un orden de operaciones, obtendría este error. Naturalmente, después de agregar los datos de la clave primaria, los datos de la clave externa en la tabla secundaria deben ajustarse al campo de la clave primaria en la tabla primaria; de lo contrario, aún recibirá este error.

Si alguien lee hasta aquí. Espero que esto haya ayudado a aclarar la respuesta marcada. Sé que hay algunos de ustedes que pueden sentir que este tipo de cosas es bastante sencillo y que abrir un libro habría respondido esta pregunta antes de que se publicara, pero la verdad es que no todos aprenden de la misma manera.


Y agregaría, asegúrese de perfilar su consulta ya que no siempre envía lo que cree que debería ser a la base de datos.
HLGEM

20

Está intentando insertar un registro con un valor en la columna de clave externa que no existe en la tabla externa.

Por ejemplo: si tiene tablas de Libros y Autores donde Libros tiene una restricción de clave foránea en la tabla de Autores e intenta insertar un registro de libro para el que no hay registro de autor.


16

Deberá publicar su declaración para obtener más aclaraciones. Pero...

Ese error significa que la tabla en la que está insertando datos tiene una relación de clave externa con otra tabla. Antes de poder insertar datos, el valor en el campo de clave externa debe existir primero en la otra tabla.


5

El problema no es con client_id por lo que puedo ver. Parece que el problema está en la cuarta columna, sup_item_cat_id

Yo correría

sp_helpconstraint sup_item

y preste atención a la columna restricint_keys devuelta para la clave externa FK_Sup_Item_Sup_Item_Cat para confirmar qué columna es el problema real, pero estoy bastante seguro de que no es la que está tratando de solucionar. Además '123123' parece sospechoso también.


5

Algo que encontré fue que todos los campos tienen que coincidir EXACTAMENTE.

Por ejemplo, enviar 'cat dog' no es lo mismo que enviar 'catdog'.

Lo que hice para solucionar este problema fue escribir el código FK de la tabla en la que estaba insertando los datos, tomar nota de la "Clave externa" que tenía las restricciones (en mi caso había 2) y asegurarse de que esos 2 valores de campo coincidieran EXACTAMENTE ya que estaban en la tabla que arrojaba el error de restricción FK.

Una vez que arreglé los 2 campos que daban mis problemas, ¡la vida fue buena!

Si necesita una mejor explicación, hágamelo saber.


Esto realmente me ayudó jaja! Pasó por alto este hecho, solucionó un problema que tenía! Gracias
Johnathan Brown

4

También obtuve el mismo error en mi código SQL, esta solución funciona para mí,


Verifique los datos en la tabla primaria. Puede estar ingresando un valor de columna que no está presente en la columna de clave primaria.


3

Significa exactamente lo que dice. Está intentando insertar un valor en una columna que tiene una restricción FK que no coincide con ningún valor en la tabla de búsqueda.


2

Verifique los campos en la relación para la que se define la clave externa. SQL Server Management Studio puede no haber seleccionado los campos que deseaba cuando definió la relación. Esto me ha quemado en el pasado.


2
  1. ejecutar sp_helpconstraint
  2. pagar ATENCIÓN a la columna restrict_keys devuelta para la clave foránea

2

Faltan datos de la tabla principal que causan el problema. En su problema, la falta de disponibilidad de datos en "dbo.Sup_Item_Cat" causa el problema


1

Tuve el mismo problema cuando utilicé migraciones de código primero para construir mi base de datos para una aplicación MVC 5. Finalmente encontré que el método de inicialización en mi archivo configuration.cs está causando el problema. Mi método de inicialización era crear una entrada de tabla para la tabla que contenía la clave externa antes de crear la entrada con la clave primaria coincidente.


1

Me encontré con este problema cuando mis campos de valor de inserción contenían pestañas y espacios que no eran obvios a simple vista. Creé mi lista de valores en Excel, la copié y la pegué en SQL, y ejecuté consultas para encontrar no coincidencias en mis campos FK.

Las consultas de coincidencia no detectaron que hubiera pestañas y espacios en mi campo FK, pero INSERT los reconoció y continuó generando el error.

Probé nuevamente copiando el contenido del campo FK en un registro y pegándolo en la consulta de inserción. Cuando ese registro también falló, miré más de cerca los datos y finalmente detecté las pestañas / espacios.

Una vez que limpié las pestañas / espacios eliminados, mi problema se resolvió. ¡Espero que esto ayude a alguien!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.