[SQL] 외래 키 제약 조건과 충돌 테이블 변경 문
SQL외래 키 제약 조건과 충돌 테이블 변경 문
내 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);
에러 메시지:
해결법
-
==============================
1.당신이 tblBana.BanNR의 값 중 하나와 일치하지 않습니다 tblBana.BanNR하지만 /과 tblDomare.PersNR의 값에 tblDomare.PersNR에서 외부 키를 만들려고하기 때문에가 발생했습니다. 당신은 참조 무결성을 위반하는 관계를 만들 수 없습니다.
당신이 tblBana.BanNR의 값 중 하나와 일치하지 않습니다 tblBana.BanNR하지만 /과 tblDomare.PersNR의 값에 tblDomare.PersNR에서 외부 키를 만들려고하기 때문에가 발생했습니다. 당신은 참조 무결성을 위반하는 관계를 만들 수 없습니다.
-
==============================
2.이 쿼리는 나에게 매우 유용했다. 그것은 어떤 일치하지 않는 모든 값을 보여줍니다
이 쿼리는 나에게 매우 유용했다. 그것은 어떤 일치하지 않는 모든 값을 보여줍니다
select FK_column from FK_table WHERE FK_column NOT IN (SELECT PK_column from PK_table)
-
==============================
3.이 솔루션을보십시오 :
이 솔루션을보십시오 :
-
==============================
4...., 외래 키를 위반하는 데이터를 허용 할 NOCHECK 함께 ALTER 표 tablename에를 사용하여 외래 키를 만들 수 있습니다.
..., 외래 키를 위반하는 데이터를 허용 할 NOCHECK 함께 ALTER 표 tablename에를 사용하여 외래 키를 만들 수 있습니다.
옵션 "NOCHECK ... WITH ALTER 표 tablename에"는 FK를 추가 -이 솔루션은 날 위해 일했습니다.
-
==============================
5.제 생각 엔, 외래 키 테이블의 열 값은 기본 키 테이블의 열 값과 일치해야합니다. 우리는 하나 개의 컬럼 내부의 값이 (외부 키를 될 것) 두 테이블 사이에 외래 키 제약 조건을 만들려고하는 경우 다음 메시지를 던질 것이다 기본 키 테이블의 열 값과 다릅니다.
제 생각 엔, 외래 키 테이블의 열 값은 기본 키 테이블의 열 값과 일치해야합니다. 우리는 하나 개의 컬럼 내부의 값이 (외부 키를 될 것) 두 테이블 사이에 외래 키 제약 조건을 만들려고하는 경우 다음 메시지를 던질 것이다 기본 키 테이블의 열 값과 다릅니다.
항상 기본 키 테이블 컬럼에 존재하는 외부 키 열에 만 값을 삽입하는 것이 좋습니다 그래서.
예를 들어. 이 값은 1과 3 사이 예상대로 차 테이블 열 값 1, 2, 3 및 외래 키 열에 삽입되어있는 경우의 값이 다른, 다음 쿼리가 실행되지 않을 것이다.
-
==============================
6.당신은 테이블에 외래 키를 추가하기 전에 다음을 수행
당신은 테이블에 외래 키를 추가하기 전에 다음을 수행
-
==============================
7.그들 사이의 관계를 만들어 다음 테이블에서 데이터를 청소합니다.
그들 사이의 관계를 만들어 다음 테이블에서 데이터를 청소합니다.
-
==============================
8.tblDomare.PersNR에서 현재 datas를 삭제하십시오. tblDomare.PersNR의 값은 tblBana.BanNR의 값 중 하나와 일치하지 않았기 때문에.
tblDomare.PersNR에서 현재 datas를 삭제하십시오. tblDomare.PersNR의 값은 tblBana.BanNR의 값 중 하나와 일치하지 않았기 때문에.
-
==============================
9.나도이 오류가 있었다 Smutje 당신이 있는지 확인을 reffered로하지 참조 테이블 즉, (기지 외래 키 테이블의 모든 값을 외래 키 열 (값에없는베이스 외래 키 테이블의 외래 키 컬럼의 값)도해야 참조 테이블 열에 일) 그것의 좋은베이스 외래 키 테이블을 먼저 설정 외래 키를 비우는
나도이 오류가 있었다 Smutje 당신이 있는지 확인을 reffered로하지 참조 테이블 즉, (기지 외래 키 테이블의 모든 값을 외래 키 열 (값에없는베이스 외래 키 테이블의 외래 키 컬럼의 값)도해야 참조 테이블 열에 일) 그것의 좋은베이스 외래 키 테이블을 먼저 설정 외래 키를 비우는
-
==============================
10.당신이 테이블 (tbldomare를) 입력 한 데이터는 기본 키 테이블을 할당 한 데이터와 일치하지 않습니다. tbldomare 사이에 작성하고 다음 코드를 실행 (NOCHECK 포함)이 단어를 추가 할 수 있습니다.
당신이 테이블 (tbldomare를) 입력 한 데이터는 기본 키 테이블을 할당 한 데이터와 일치하지 않습니다. tbldomare 사이에 작성하고 다음 코드를 실행 (NOCHECK 포함)이 단어를 추가 할 수 있습니다.
예를 들어, 당신은이 데이터 tbldomar 테이블을 입력
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet) Values (6811034679,'Bengt','Carlberg',10);
당신은 단지 1,2,3 동의 외래 키 테이블을 할당.
이 두 가지 솔루션을 하나는 테이블이 다음 코드를 실행 입력 한 데이터를 삭제합니다. 또 다른 (NOCHECK 포함)이 단어를 쓰기 테이블 이름과 추가 사이에 넣어이다 이 같은
ALTER TABLE tblDomare with nocheck ADD FOREIGN KEY (PersNR) REFERENCES tblBana(BanNR);
-
==============================
11.이것은 내가 내 데이터베이스를 설계하고 있기 때문에, 나는 이제 관계형 테이블은 기본 테이블에없는 외래 키가없는, 내 기본 테이블에 내 씨앗을 변경할 것을 알 나에게 발생합니다.
이것은 내가 내 데이터베이스를 설계하고 있기 때문에, 나는 이제 관계형 테이블은 기본 테이블에없는 외래 키가없는, 내 기본 테이블에 내 씨앗을 변경할 것을 알 나에게 발생합니다.
그래서 두 테이블을자를 필요가 있고, 지금 작동한다!
-
==============================
12.테이블이 행에 데이터가있는 경우 당신은 볼 수 있습니다. 만약 "예"다음 테이블 (들)을 절단해야한다 그렇지 않으면 당신이 그들을 tblBana.BanNR 및 바이스 구절에 tblDomare.PersNR에서 동일한 데이터 수를 가질 수 있습니다.
테이블이 행에 데이터가있는 경우 당신은 볼 수 있습니다. 만약 "예"다음 테이블 (들)을 절단해야한다 그렇지 않으면 당신이 그들을 tblBana.BanNR 및 바이스 구절에 tblDomare.PersNR에서 동일한 데이터 수를 가질 수 있습니다.
-
==============================
13.Smutje는 정확하고 차드 HedgeCock은 훌륭한 평신도의 예를 제공했다. 레코드를 찾기 / 삭제 할 수있는 방법을 제공함으로써 차드의 예에 빌드와 같은 ID입니다. 우리는 자녀와 부모와 주문으로 고객을 사용합니다. 고객 ID는 일반적인 필드입니다.
Smutje는 정확하고 차드 HedgeCock은 훌륭한 평신도의 예를 제공했다. 레코드를 찾기 / 삭제 할 수있는 방법을 제공함으로써 차드의 예에 빌드와 같은 ID입니다. 우리는 자녀와 부모와 주문으로 고객을 사용합니다. 고객 ID는 일반적인 필드입니다.
select * from Order Child left join Customer Parent on Child.CustomerId = Parent.CustomerId where Parent.CustomerId is null
이 스레드를 읽고 있다면 ... 당신은 결과를 얻을 수 있습니다. 다음은 고아입니다. 주문 하위 SELECT * FROM 왼쪽 Child.CustomerId = Parent.CustomerId에 고객 학부모 참여 어디 Parent.CustomerId는 오른쪽 아래에있는 행 수를 참고 NULL입니다.
확인 GO w / 당신이 이러한 행을 삭제하려고하는 것이 필요 누구든!
begin tran delete Order from Order Child left join Customer Parent on Child.CustomerId = Parent.CustomerId where Parent.CustomerId is null
첫 번째 비트를 실행합니다. 당신이 기대했던 그 행 수를 = 확인
트란 커밋
commit tran
조심해. 누군가의 실수 프로그래밍이 엉망으로 당신을 얻었다. 반드시 당신이 이해했는지 확인 왜 고아를 삭제하기 전에. 어쩌면 부모가 복원 될 필요가있다.
-
==============================
14.기존 데이터에 새로운 외래 키를 만들려고에, EF를 사용하여 내 시나리오에서는, 내가 잘못 데이터가 외부 키를 생성 한 후 (링크를 만드는) 채우기 위해 노력했다.
기존 데이터에 새로운 외래 키를 만들려고에, EF를 사용하여 내 시나리오에서는, 내가 잘못 데이터가 외부 키를 생성 한 후 (링크를 만드는) 채우기 위해 노력했다.
수정은 링크가 실제로 유효한지 그들 모두를 확인하기 때문에 외부 키를 작성하기 전에 데이터를 채우는 것입니다. 당신이 아직 채워지지 않은 경우는 가능성이 작동하지 않을 수 있도록.
-
==============================
15.내 프로젝트에 몇 가지 문제가 발생합니다.
내 프로젝트에 몇 가지 문제가 발생합니다.
자식 테이블에서, 이드 1 11에 해당 어떤 기록이 없다
나는 이드 1 11 다음 내가 만들 수 FK 동일 DEAL_ITEM_THIRD_PARTY_PO 테이블을 삽입
-
==============================
16.다음하시기 바랍니다 먼저 삭제하는 것이 테이블에서 데이터 마이그레이션을 다시 실행합니다. 당신은 성공을 얻을 것이다
다음하시기 바랍니다 먼저 삭제하는 것이 테이블에서 데이터 마이그레이션을 다시 실행합니다. 당신은 성공을 얻을 것이다
-
==============================
17.당신은 테이블 A의 기본 키를 참조하는 테이블 B의 외래 키를 정의 할 때 그것은이 테이블에 unconsistent 수정을 방지하는 것입니다 값이 B에있을 때, 그것은 A.에 있어야합니다 것을 의미한다.
당신은 테이블 A의 기본 키를 참조하는 테이블 B의 외래 키를 정의 할 때 그것은이 테이블에 unconsistent 수정을 방지하는 것입니다 값이 B에있을 때, 그것은 A.에 있어야합니다 것을 의미한다.
당신의 예에서, 당신의 테이블을 포함 :
PRIMARY KEY와 tblDomare (PersNR) :
PersNR |fNamn |eNamn |Erfarenhet -----------|----------|-----------|---------- 6811034679 |'Bengt' |'Carlberg' |10 7606091347 |'Josefin' |'Backman' |4 8508284163 |'Johanna' |'Backman' |1 ---------------------------------------------
Thblbna :
BanNR ----- 1 2 3 -----
이 문 :
ALTER TABLE tblDomare ADD FOREIGN KEY (PersNR) REFERENCES tblBana(BanNR);
키 PersNR와 tblDomare의 모든 라인은 키 BanNR에 테이블 tblBana의 correspondance에 있어야합니다 말한다. 당신이 tblBana 없음 correspondance에와 tblDomare에 삽입 라인을 가지고 있기 때문에 귀하의 오류입니다.
문제를 해결하기 위해이 개 솔루션 : - 하나에서 BanNR와 tblBana에 줄을 추가 (6811034679, 7606091347, 8508284163) - 또는 더 correspondance에 intblBana`이 없습니다 intblDomarethat 모든 행을 제거합니다 (그러나 테이블이 비어있을 것입니다)
일반 조언 : 당신이 테이블을 채우기 전에 외래 키 제약 조건이 있어야합니다. 외부 키는 불일치 테이블을 채우는에서 테이블의 사용자를 방지하기 위해 여기에 있습니다.
-
==============================
18.그냥 참고로, 경우에 당신은 분명히 두 개의 테이블과 해당 필드가 두 테이블의 기본 키입니다 필드 사이에 외래 키 제약 조건을 만들 수 없습니다 ... 데이터 참조 모든 검사를하고 나쁜 데이터를 찾을 수 없습니다! 나는이 방법을 알고 나 한테 물어하지 마십시오.
그냥 참고로, 경우에 당신은 분명히 두 개의 테이블과 해당 필드가 두 테이블의 기본 키입니다 필드 사이에 외래 키 제약 조건을 만들 수 없습니다 ... 데이터 참조 모든 검사를하고 나쁜 데이터를 찾을 수 없습니다! 나는이 방법을 알고 나 한테 물어하지 마십시오.
from https://stackoverflow.com/questions/21839309/the-alter-table-statement-conflicted-with-the-foreign-key-constraint by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 링크 된 MySQL 서버 SELECT * FROM (0) | 2020.06.17 |
---|---|
[SQL] SQL 서버에 입력 된 방법을 순서대로 정렬? (0) | 2020.06.17 |
[SQL] 어떻게 널 값에 대한 이전 값을 얻을 수 있습니다 (0) | 2020.06.17 |
[SQL] 열고 주변의 가까운 브래킷 MS 액세스 SQL에서 조인 할 때 (0) | 2020.06.17 |
[SQL] 어떻게 데이터에 대한 상호 참조 테이블 / 쿼리를 만들려면 어떻게해야합니까? (0) | 2020.06.17 |