내 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'에서 충돌이 발생했습니다.
그것은 tblDomare.PersNR
에서 tblBana.BanNR
로 외래 키를 만들려고했으나 tblDomare.PersNR
의 값이 tblBana.BanNR
의 값과 일치하지 않았기 때문에 발생했습니다. 참조 무결성을 위반하는 관계는 만들 수 없습니다.
이 쿼리는 나에게 매우 유용했다. 일치하지 않는 모든 값을 표시합니다.
select FK_column from FK_table
WHERE FK_column NOT IN
(SELECT PK_column from PK_table)
외래 키를 위반하는 데이터를 허용하는 ALTER TABLE tablename WITH NOCHECK ...을 사용하여 외래 키를 작성할 수 있습니다.
"ALTER TABLE tablename WITH NOCHECK ..."옵션이 FK 추가 -이 솔루션은 나를 위해 일했습니다.
이 솔루션을 사용해보십시오.
테이블에 연관된 값이 기본 키 테이블로 사용하려는 테이블에없는 데이터 항목이 테이블에 있습니다. 테이블을 비게 만들거나 연관된 값을 두 번째 테이블에 추가하십시오.
테이블에 외래 키를 추가하기 전에 다음을 수행하십시오.
표가 포함되어 있으면 설계 및 변경하지 말고 수동으로 수행하십시오.
alter table 표 1 외부 키 추가 (열 이름) 참조 표 2 (열 이름)
alter table 표 1 alter column 열 이름 속성 not null
외부 키 테이블의 열 값이 기본 키 테이블의 열 값과 일치해야합니다. 한 컬럼 (외부 키가 될) 내의 값이 기본 키 테이블의 컬럼 값과 다른 두 테이블 사이에 외래 키 제약 조건을 작성하려고하면 메시지를 던집니다.
따라서 항상 기본 키 테이블 열에있는 값을 외래 키 열에 삽입하는 것이 좋습니다.
예를 들어. 기본 테이블 열에 값 1, 2, 3이 있고 외부 키 열에 삽입 된 값이 다른 경우 값이 1과 3 사이에 있어야하므로 쿼리가 실행되지 않습니다.
테이블에서 데이터를 정리 한 다음 테이블간에 데이터를 정리하십시오.
tblDomare.PersNR
에서 현재 데이터를 DELETE
해보십시오. tblDomare.PersNR
의 값이 tblBana.BanNR
의 값과 일치하지 않았기 때문입니다.
나는 Smutje가 당신이 참조 테이블에없는 기본 외래 키 테이블의 외래 키 컬럼에 값을 가지지 않았는지 확인했다. 즉, (기본 외래 키 테이블에있는 모든 값 ( 외래 키)도 참조 테이블 열에 있어야합니다. 기본 외래 키 테이블을 먼저 비운 다음 외래 키를 설정하는 것이 좋습니다.
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
조심해. 누군가 엉성한 프로그래밍으로 당신을이 혼란에 빠지게했습니다. 고아를 삭제하기 전에 이유를 이해했는지 확인하십시오. 어쩌면 부모를 회복시켜야 할 수도 있습니다.
테이블에 행에 대한 데이터가 있는지 확인해야합니다. "예"일 경우 표를 자르면됩니다. 그렇지 않으면 tblDomare.PersNR
와 tblBana.BanNR
및 vise-verse에 동일한 수의 데이터를 갖도록 할 수 있습니다.
테이블 (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);
내 데이터베이스를 설계 할 때부터 내 주 테이블에서 시드를 변경했음을 알게되었습니다. 이제 관계형 테이블에 주 테이블에 외래 키가 없습니다.
그래서 두 테이블을 모두 잘라야합니다. 이제 작동합니다!
내 시나리오에서 EF를 사용하여 기존 데이터 에서이 새로운 외래 키를 만들려고 할 때 외래 키를 만든 후 데이터를 채우려 고 (링크 만들기) 잘못했습니다.
수정은 외래 키가 링크가 실제로 유효한지 확인하기 위해 외래 키를 만들기 전에 데이터를 채우는 것입니다. 아직 채워 넣지 않으면 작동하지 않을 수 있습니다.