2009-10-05 2 views
3

외래 키 검사가 과거에 비활성화 된 데이터베이스에서 외래 키 제약 조건 위반을 확인하려면 어떻게해야합니까??전체 데이터베이스에서 외래 키 위반을 찾는 방법은 무엇입니까? (현재 MySQL을 사용하고 있습니다)

+0

을 내가 찾아 데이터베이스에 잘못된 데이터를 입력하기 전에 "두통"을 처리하기 위해 더 나은 생각합니다. 일을 더 쉽게하기 위해 외래 키를 끄면, 당신은 일을 더 악화시키고 외래 키를 가지고있는 전체 목적을 이기고 있습니다. 데이터를 사전 처리하십시오.나쁜 데이터를 의도적으로 데이터베이스에 저장하지 마십시오. – HLGEM

+1

foreing key violation을 모두 확인하려면 http://stackoverflow.com/a/5977191/950503을 사용할 수 있습니다. – windm

답변

-1

외부 키 제한 조건을 사용하면 모든 관계가 검사되므로 잘못된 것이 있으면 오류가 발생합니다.

+1

외래 키 제약 조건이 이유 때문에 비활성화되었다는 점에 의문이 있습니다. 데이터가로드 된 후에 다시 켜면 mysql이 기존 데이터를 검사하지 않는다. 이 대답은 어떻게 유용합니까? – longneck

+1

위반이있을 경우 MySQL에서 외래 키를 활성화하는 것이 실패하지 않는다는 것을 증명하십시오. 그것이 사실이라면 외래 키는 쓸모 없게됩니다. 버그가있는 경우 ALTER TABLE을 사용하여 FK 제약 조건을 제거한 다음 추가합니다. FK 제약 조건을 추가하면 DB *는 데이터를 확인해야합니다. –

+1

mysql은 외래 키를 지원하고이를 적용합니다. 관계형 데이터의 데이터 가져 오기 속도를 높이기 위해 해당 키의 적용을 일시적으로 비활성화 할 수도 있습니다. http://dev.mysql.com/doc/refman/5.0/en/server-session-variables.html#sysvar_foreign_key_checks – longneck

0

이렇게하려면 기본 제공 방법이 없습니다. 내가 생각할 수있는 유일한 것은 INFORMATION_SCHEMA 데이터베이스의 TABLE_CONSTRAINTSKEY_COLUMN_USAGE 테이블을보고 일치하지 않는 행을 수동으로 확인하는 것입니다.

-1

로드 후 FK를 "켜는"것은 실제로 검사를 수행해야합니다.

DBMS가 그렇게하지 않으면 덤프하십시오.

DBMS가 그런 일을하지 않고 계속 그런 쓰레기를 사용하고 싶다면, 적절한 RA의 SEMIMINUS 표현식에 대한 질의를 할 수 있습니다. WHERE PK_attribute1 = FK_attribute1 및 PK_attribute2 = FK_attribute2 및 ... table_with_PK 로부터 NOT이 존재 table_with_FK ( SELECT ... 로부터

SELECT ... :

이 같이 보일 가능성이 높습니다) 그리고 당신은로드 된 행

> 또는 DBMS)을 제외하고 지원하는 경우 (좀 더 현대적인 식별 할 수 있습니다 여기 < 아무것도 :

SELECT FK_attributes table_with_FK FROM 당신이로드 된 행 > 를 제외하고 SELECT가 table_with_PK 로부터 을 PK_attributes_possibly_renamed을 식별 할 수 있습니다 여기 < 아무것도;

편집 (에 "모두가 오라클을 필요로하고 IBM 제품을 크기."대답은 덤프 "좋은 충고가 아닙니다.")

영업 이익은 매우 명확 그는 데이터 무결성 명확히 관심이 있음을 지적하고있다. 그래서 그는 실제로 데이터 무결성을 보장하기 위해 약간의 전문적인 수준의 지원을 제공하는 DBMS 제품을 사용해야합니다. 나는 "오라클과 IBM의 규모 제품"이 그렇게하는 유일한 사람은 아니라고 진심으로 희망합니다.

+0

모두에게 오라클과 IBM 크기의 제품이 필요하지는 않습니다. "덤프"는 좋은 조언이 아닙니다. – longneck

+0

@longneck : 오라클과 IBM보다 DBMS 제품이 더 많습니다. 사실, 사용자가 이미 MySQL을 사용하고 있다면, MySQL을 버리면 PostgreSQL이 다음으로 논리적 인 선택이 될 것이라고 생각합니다. – Powerlord

0

기본적으로 "외래 키를 사용하여 참조 무결성을 어떻게 보장 할 수 있습니까?"라는 질문을 할 수있는 것처럼 들립니다.

외래 키를 사용하지 않도록 설정 한 바로 그 "두통"이 상상 한 것입니다. 그래서 나에게 가장 간단한 대답은 처음부터 그들을 무력화시키지 않는 것 같습니다. 처음에는 올바르게하고 나중에 다시하지 않아도됩니다. 더 외래 키 제약 조건이없는 경우

+1

이것은 도움이되지 않습니다. * "Q : 부러진 팔은 어떻게 치료합니까? A ​​: 팔을 부러 뜨리지 마십시오."* 어, 좋아요.하지만 팔이 부러져서 여기 있습니다. –

2

기본적으로, 당신은이 작업을 수행 할 수 있습니다

SELECT * FROM CHILD C WHERE C.PARENT_ID NOT IN (SELECT ID FROM PARENT); 
+1

-1; 첫 번째로 OP에서 설명한 상황은 "외래 키 제약 조건 없음"*이 아니며 두 번째로이 질문에서 "전체 데이터베이스"조건을 무시합니다. –