it-swarm-ko.com

ALTER TABLE 문이 FOREIGN KEY 제약 조건과 충돌했습니다.

tblDomare 테이블에 외래 키를 추가하려고 할 때 문제가 있습니다. 여기서 내가 뭘 잘못하고 있니?

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);

에러 메시지:

ALTER TABLE 문은 FOREIGN KEY 제약 조건 "FK _ tblDomare _ PersN__5F7E2DAC"와 충돌했습니다. 데이터베이스 "almu0004", 테이블 "dbo.tblBana", 열 'BanNR'에서 충돌이 발생했습니다.

152
user3162932

그것은 tblDomare.PersNR에서 tblBana.BanNR로 외래 키를 만들려고했으나 tblDomare.PersNR의 값이 tblBana.BanNR의 값과 일치하지 않았기 때문에 발생했습니다. 참조 무결성을 위반하는 관계는 만들 수 없습니다.

284
Smutje

이 쿼리는 나에게 매우 유용했다. 일치하지 않는 모든 값을 표시합니다.

select FK_column from FK_table
WHERE FK_column NOT IN
(SELECT PK_column from PK_table)
28
dantey89

외래 키를 위반하는 데이터를 허용하는 ALTER TABLE tablename WITH NOCHECK ...을 사용하여 외래 키를 작성할 수 있습니다.

"ALTER TABLE tablename WITH NOCHECK ..."옵션이 FK 추가 -이 솔루션은 나를 위해 일했습니다.

24
Ankita Biswas

이 솔루션을 사용해보십시오.

테이블에 연관된 값이 기본 키 테이블로 사용하려는 테이블에없는 데이터 항목이 테이블에 있습니다. 테이블을 비게 만들거나 연관된 값을 두 번째 테이블에 추가하십시오.

17
PatsonLeaner

테이블에 외래 키를 추가하기 전에 다음을 수행하십시오.

  1. 테이블이 비어 있어야하거나 열 데이터가 일치해야합니다.
  2. Null이 아닌지 확인하십시오.
  3. 표가 포함되어 있으면 설계 및 변경하지 말고 수동으로 수행하십시오.

    alter table 표 1 외부 키 추가 (열 이름) 참조 표 2 (열 이름)

    alter table 표 1 alter column 열 이름 속성 not null

10
GirishBabuC

외부 키 테이블의 열 값이 기본 키 테이블의 열 값과 일치해야합니다. 한 컬럼 (외부 키가 될) 내의 값이 기본 키 테이블의 컬럼 값과 다른 두 테이블 사이에 외래 키 제약 조건을 작성하려고하면 메시지를 던집니다.

따라서 항상 기본 키 테이블 열에있는 값을 외래 키 열에 삽입하는 것이 좋습니다.

예를 들어. 기본 테이블 열에 값 1, 2, 3이 있고 외부 키 열에 삽입 된 값이 다른 경우 값이 1과 3 사이에 있어야하므로 쿼리가 실행되지 않습니다.

9
sam05

테이블에서 데이터를 정리 한 다음 테이블간에 데이터를 정리하십시오.

6
max

tblDomare.PersNR에서 현재 데이터를 DELETE 해보십시오. tblDomare.PersNR의 값이 tblBana.BanNR의 값과 일치하지 않았기 때문입니다.

4
Thinker Bell

나는 Smutje가 당신이 참조 테이블에없는 기본 외래 키 테이블의 외래 키 컬럼에 값을 가지지 않았는지 확인했다. 즉, (기본 외래 키 테이블에있는 모든 값 ( 외래 키)도 참조 테이블 열에 있어야합니다. 기본 외래 키 테이블을 먼저 비운 다음 외래 키를 설정하는 것이 좋습니다.

3
ako

Smutje는 정확하고 Chad HedgeCock은 훌륭한 평신도의 모범을 보여주었습니다. Id는 Chad의 예를 기반으로 이러한 레코드를 찾고 삭제할 수있는 방법을 제공합니다. 우리는 고객을 부모 및 주문서로 사용합니다. CustomerId는 공통 필드입니다.

select * from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

이 글을 읽는다면 결과를 얻을 수 있습니다. 이들은 고아가 된 아이들입니다. select * from order 하위 하위 조인 고객 부모 Child.CustomerId = Parent.CustomerId 여기서 Parent.CustomerId는 null입니다. 오른쪽 아래 행 수를 유의하십시오.

이 행을 삭제할 필요가있는 사람이 누구인지 확인하십시오.

begin tran 
delete Order
from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

첫 번째 비트를 실행하십시오. 행 수 = 예상했던 것 확인하십시오.

트란을 저 지르다.

commit tran 

조심해. 누군가 엉성한 프로그래밍으로 당신을이 혼란에 빠지게했습니다. 고아를 삭제하기 전에 이유를 이해했는지 확인하십시오. 어쩌면 부모를 회복시켜야 할 수도 있습니다.

2
greg

테이블에 행에 대한 데이터가 있는지 확인해야합니다. "예"일 경우 표를 자르면됩니다. 그렇지 않으면 tblDomare.PersNRtblBana.BanNR 및 vise-verse에 동일한 수의 데이터를 갖도록 할 수 있습니다.

2
adrianex03

테이블 (tbldomare)을 입력 한 데이터가 기본 키 테이블을 지정한 데이터와 일치하지 않습니다. tbldomare 사이에 쓰고이 단어를 (nocheck로) 추가 한 다음 코드를 실행하십시오.

예를 들어이 데이터를 테이블 tbldomar에 입력했습니다.

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);

foreign key 테이블 만 지정하여 1,2,3 만 수락했습니다.

당신은 하나의 테이블을 입력 한 다음 코드를 실행하는 데이터를 삭제하는 두 가지 해결책이 있습니다. 또 다른이 단어를 (nocheck와 함께) 귀하의 테이블 이름 사이에 넣어이 같은 쓰기

ALTER TABLE  tblDomare with nocheck
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);
2
khadar

내 데이터베이스를 설계 할 때부터 내 주 테이블에서 시드를 변경했음을 알게되었습니다. 이제 관계형 테이블에 주 테이블에 외래 키가 없습니다.

그래서 두 테이블을 모두 잘라야합니다. 이제 작동합니다!

2
Willy David Jr

내 시나리오에서 EF를 사용하여 기존 데이터 에서이 새로운 외래 키를 만들려고 할 때 외래 키를 만든 후 데이터를 채우려 고 (링크 만들기) 잘못했습니다.

수정은 외래 키가 링크가 실제로 유효한지 확인하기 위해 외래 키를 만들기 전에 데이터를 채우는 것입니다. 아직 채워 넣지 않으면 작동하지 않을 수 있습니다.

0
JeromeJ