복붙노트

[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. ==============================

    1.당신이 tblBana.BanNR의 값 중 하나와 일치하지 않습니다 tblBana.BanNR하지만 /과 tblDomare.PersNR의 값에 tblDomare.PersNR에서 외부 키를 만들려고하기 때문에가 발생했습니다. 당신은 참조 무결성을 위반하는 관계를 만들 수 없습니다.

    당신이 tblBana.BanNR의 값 중 하나와 일치하지 않습니다 tblBana.BanNR하지만 /과 tblDomare.PersNR의 값에 tblDomare.PersNR에서 외부 키를 만들려고하기 때문에가 발생했습니다. 당신은 참조 무결성을 위반하는 관계를 만들 수 없습니다.

  2. ==============================

    2.이 쿼리는 나에게 매우 유용했다. 그것은 어떤 일치하지 않는 모든 값을 보여줍니다

    이 쿼리는 나에게 매우 유용했다. 그것은 어떤 일치하지 않는 모든 값을 보여줍니다

    select FK_column from FK_table
    WHERE FK_column NOT IN
    (SELECT PK_column from PK_table)
    
  3. ==============================

    3.이 솔루션을보십시오 :

    이 솔루션을보십시오 :

  4. ==============================

    4...., 외래 키를 위반하는 데이터를 허용 할 NOCHECK 함께 ALTER 표 tablename에를 사용하여 외래 키를 만들 수 있습니다.

    ..., 외래 키를 위반하는 데이터를 허용 할 NOCHECK 함께 ALTER 표 tablename에를 사용하여 외래 키를 만들 수 있습니다.

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

  5. ==============================

    5.제 생각 엔, 외래 키 테이블의 열 값은 기본 키 테이블의 열 값과 일치해야합니다. 우리는 하나 개의 컬럼 내부의 값이 (외부 키를 될 것) 두 테이블 사이에 외래 키 제약 조건을 만들려고하는 경우 다음 메시지를 던질 것이다 기본 키 테이블의 열 값과 다릅니다.

    제 생각 엔, 외래 키 테이블의 열 값은 기본 키 테이블의 열 값과 일치해야합니다. 우리는 하나 개의 컬럼 내부의 값이 (외부 키를 될 것) 두 테이블 사이에 외래 키 제약 조건을 만들려고하는 경우 다음 메시지를 던질 것이다 기본 키 테이블의 열 값과 다릅니다.

    항상 기본 키 테이블 컬럼에 존재하는 외부 키 열에 만 값을 삽입하는 것이 좋습니다 그래서.

    예를 들어. 이 값은 1과 3 사이 예상대로 차 테이블 열 값 1, 2, 3 및 외래 키 열에 삽입되어있는 경우의 값이 다른, 다음 쿼리가 실행되지 않을 것이다.

  6. ==============================

    6.당신은 테이블에 외래 키를 추가하기 전에 다음을 수행

    당신은 테이블에 외래 키를 추가하기 전에 다음을 수행

  7. ==============================

    7.그들 사이의 관계를 만들어 다음 테이블에서 데이터를 청소합니다.

    그들 사이의 관계를 만들어 다음 테이블에서 데이터를 청소합니다.

  8. ==============================

    8.tblDomare.PersNR에서 현재 datas를 삭제하십시오. tblDomare.PersNR의 값은 tblBana.BanNR의 값 중 하나와 일치하지 않았기 때문에.

    tblDomare.PersNR에서 현재 datas를 삭제하십시오. tblDomare.PersNR의 값은 tblBana.BanNR의 값 중 하나와 일치하지 않았기 때문에.

  9. ==============================

    9.나도이 오류가 있었다 Smutje 당신이 있는지 확인을 reffered로하지 참조 테이블 즉, (기지 외래 키 테이블의 모든 값을 외래 키 열 (값에없는베이스 외래 키 테이블의 외래 키 컬럼의 값)도해야 참조 테이블 열에 일) 그것의 좋은베이스 외래 키 테이블을 먼저 설정 외래 키를 비우는

    나도이 오류가 있었다 Smutje 당신이 있는지 확인을 reffered로하지 참조 테이블 즉, (기지 외래 키 테이블의 모든 값을 외래 키 열 (값에없는베이스 외래 키 테이블의 외래 키 컬럼의 값)도해야 참조 테이블 열에 일) 그것의 좋은베이스 외래 키 테이블을 먼저 설정 외래 키를 비우는

  10. ==============================

    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. ==============================

    11.이것은 내가 내 데이터베이스를 설계하고 있기 때문에, 나는 이제 관계형 테이블은 기본 테이블에없는 외래 키가없는, 내 기본 테이블에 내 씨앗을 변경할 것을 알 나에게 발생합니다.

    이것은 내가 내 데이터베이스를 설계하고 있기 때문에, 나는 이제 관계형 테이블은 기본 테이블에없는 외래 키가없는, 내 기본 테이블에 내 씨앗을 변경할 것을 알 나에게 발생합니다.

    그래서 두 테이블을자를 필요가 있고, 지금 작동한다!

  12. ==============================

    12.테이블이 행에 데이터가있는 경우 당신은 볼 수 있습니다. 만약 "예"다음 테이블 (들)을 절단해야한다 그렇지 않으면 당신이 그들을 tblBana.BanNR 및 바이스 구절에 tblDomare.PersNR에서 동일한 데이터 수를 가질 수 있습니다.

    테이블이 행에 데이터가있는 경우 당신은 볼 수 있습니다. 만약 "예"다음 테이블 (들)을 절단해야한다 그렇지 않으면 당신이 그들을 tblBana.BanNR 및 바이스 구절에 tblDomare.PersNR에서 동일한 데이터 수를 가질 수 있습니다.

  13. ==============================

    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. ==============================

    14.기존 데이터에 새로운 외래 키를 만들려고에, EF를 사용하여 내 시나리오에서는, 내가 잘못 데이터가 외부 키를 생성 한 후 (링크를 만드는) 채우기 위해 노력했다.

    기존 데이터에 새로운 외래 키를 만들려고에, EF를 사용하여 내 시나리오에서는, 내가 잘못 데이터가 외부 키를 생성 한 후 (링크를 만드는) 채우기 위해 노력했다.

    수정은 링크가 실제로 유효한지 그들 모두를 확인하기 때문에 외부 키를 작성하기 전에 데이터를 채우는 것입니다. 당신이 아직 채워지지 않은 경우는 가능성이 작동하지 않을 수 있도록.

  15. ==============================

    15.내 프로젝트에 몇 가지 문제가 발생합니다.

    내 프로젝트에 몇 가지 문제가 발생합니다.

    자식 테이블에서, 이드 1 11에 해당 어떤 기록이 없다

    나는 이드 1 11 다음 내가 만들 수 FK 동일 DEAL_ITEM_THIRD_PARTY_PO 테이블을 삽입

  16. ==============================

    16.다음하시기 바랍니다 먼저 삭제하는 것이 테이블에서 데이터 마이그레이션을 다시 실행합니다. 당신은 성공을 얻을 것이다

    다음하시기 바랍니다 먼저 삭제하는 것이 테이블에서 데이터 마이그레이션을 다시 실행합니다. 당신은 성공을 얻을 것이다

  17. ==============================

    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. ==============================

    18.그냥 참고로, 경우에 당신은 분명히 두 개의 테이블과 해당 필드가 두 테이블의 기본 키입니다 필드 사이에 외래 키 제약 조건을 만들 수 없습니다 ... 데이터 참조 모든 검사를하고 나쁜 데이터를 찾을 수 없습니다! 나는이 방법을 알고 나 한테 물어하지 마십시오.

    그냥 참고로, 경우에 당신은 분명히 두 개의 테이블과 해당 필드가 두 테이블의 기본 키입니다 필드 사이에 외래 키 제약 조건을 만들 수 없습니다 ... 데이터 참조 모든 검사를하고 나쁜 데이터를 찾을 수 없습니다! 나는이 방법을 알고 나 한테 물어하지 마십시오.

  19. from https://stackoverflow.com/questions/21839309/the-alter-table-statement-conflicted-with-the-foreign-key-constraint by cc-by-sa and MIT license