sql - script - La sentencia ALTER TABLE está en conflicto con la restricción FOREIGN KEY
sql server management studio (12)
Antes de agregar una clave externa a la tabla, haga lo siguiente
- Asegúrese de que la tabla debe estar vacía o Los datos de la columna deben coincidir.
- Asegúrate de que no sea nulo.
Si la tabla contiene, no vaya al diseño y cambie, hágalo manualmente.
alter table Tabla 1 add foreign key (Column Name) references Tabla 2 (Nombre de la columna)
alterar tabla Tabla 1 alterar columna atributo de nombre de columna no nulo
Tengo un problema al intentar agregar una clave externa a mi tabla tblDomare
; ¿Qué estoy haciendo mal aquí?
CREATE TABLE tblDomare
(PersNR VARCHAR (15) NOT NULL,
fNamn VARCHAR (15) NOT NULL,
eNamn VARCHAR (20) NOT NULL,
Erfarenhet VARCHAR (5),
PRIMARY KEY (PersNR));
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,''Bengt'',''Carlberg'',10);
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (7606091347,''Josefin'',''Backman'',4);
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (8508284163,''Johanna'',''Backman'',1);
CREATE TABLE tblBana
(BanNR VARCHAR (15) NOT NULL,
PRIMARY KEY (BanNR));
INSERT INTO tblBana (BanNR)
Values (1);
INSERT INTO tblBana (BanNR)
Values (2);
INSERT INTO tblBana (BanNR)
Values (3);
ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);
Mensaje de error:
La instrucción ALTER TABLE entró en conflicto con la restricción FOREIGN KEY "FK_ tblDomare _PersN__5F7E2DAC". El conflicto ocurrió en la base de datos "almu0004", tabla "dbo.tblBana", columna "BanNR".
Es posible crear la clave externa usando ALTER TABLE tablename WITH NOCHECK ..., lo que permitirá que los datos violen la clave foránea.
"ALTER TABLE tablename WITH NOCHECK ..." opción para agregar el FK - Esta solución funcionó para mí.
Esta consulta fue muy útil para mí. Muestra todos los valores que no tienen ninguna coincidencia
select FK_column from FK_table
WHERE FK_column NOT IN
(SELECT PK_column from PK_table)
Esto me pasa, ya que estoy diseñando mi base de datos, noto que cambio mi semilla en mi tabla principal, ahora la tabla relacional no tiene una clave externa en la tabla principal.
Así que necesito truncar ambas tablas, ¡y ahora funciona!
Limpia tus datos de tus tablas y luego establece una relación entre ellos.
Ocurrió porque trataste de crear una clave foránea de tblDomare.PersNR
a tblBana.BanNR
pero / y los valores en tblDomare.PersNR
no coincidían con ninguno de los valores en tblBana.BanNR
. No puede crear una relación que viole la integridad referencial.
Smutje está en lo correcto y Chad HedgeCock ofreció un gran ejemplo de laico. Me gustaría construir sobre el ejemplo de Chad ofreciendo una forma de encontrar / eliminar esos registros. Utilizaremos al Cliente como Padre y orden como el niño. CustomerId es el campo común.
select * from Order Child
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null
si estás leyendo este hilo ... obtendrás resultados. Estos son niños huérfanos. select * from Order Child left join Cliente Parent en Child.CustomerId = Parent.CustomerId donde Parent.CustomerId es nulo Observe el recuento de filas en la parte inferior derecha.
¡Verifique con quien necesite que va a eliminar estas filas!
begin tran
delete Order
from Order Child
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null
Ejecute el primer bit. Verifica el recuento de filas = lo que esperabas
cometer el tran
commit tran
Ten cuidado. La programación descuidada de alguien te metió en este lío. Asegúrate de entender por qué antes de eliminar a los huérfanos. Tal vez el padre necesita ser restaurado.
Supongo que un valor de columna en una tabla de clave externa debe coincidir con el valor de columna de la tabla de clave principal. Si intentamos crear una restricción de clave externa entre dos tablas donde el valor dentro de una columna (que va a ser la clave externa) es diferente del valor de la columna de la tabla de clave primaria, arrojará el mensaje.
Por lo tanto, siempre se recomienda insertar solo esos valores en la columna clave externa que están presentes en la columna de la tabla clave principal.
Por ej. Si la columna de la tabla primaria tiene los valores 1, 2, 3 y en la columna de clave externa los valores insertados son diferentes, entonces la consulta no se ejecutará ya que espera que los valores estén entre 1 y 3.
Tuve el mismo problema también.
Ella es la solución correcta y precisa:
hay un elemento de datos en su tabla que dice que su valor asociado no existe en la tabla que desea usar como tabla de clave principal. haga que su mesa esté vacía o agregue el valor asociado a la segunda tabla
los datos que ha ingresado en una tabla (tbldomare) no coinciden con los datos que ha asignado a la tabla de claves principales. escriba entre tbldomare y agregue esta palabra (con nocheck) luego ejecute su código.
por ejemplo, usted ingresó una tabla tbldomar esta información
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,''Bengt'',''Carlberg'',10);
y asignó una tabla de foreign key
para aceptar solo 1,2,3
.
tienes dos soluciones, una es borrar los datos que has ingresado en una tabla y luego ejecutar el código. otro es escribir esta palabra (con nocheck) ponerlo entre el nombre de su tabla y agregar como este
ALTER TABLE tblDomare with nocheck
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);
también tuve este error porque Smutje refirió asegúrese de que no tiene un valor en la columna de clave externa de la tabla de clave externa base que no está en su tabla de referencia, es decir (cada valor en su tabla de clave externa base (valor de una columna que es clave externa) también debe estar en la columna de la tabla de referencia. Es bueno vaciar primero la tabla de clave externa base y luego establecer claves externas
y solo FYI, en caso de que haga todas las comprobaciones de referencia de datos y no encuentre datos incorrectos ... aparentemente no es posible crear una restricción de clave foránea entre dos tablas y campos donde esos campos son la clave primaria en ambas tablas. No me preguntes cómo sé esto.