[SQL] 어떻게 일시적으로 MySQL의에서 외래 키 제약 조건을 비활성화 할 수 있습니다?
SQL어떻게 일시적으로 MySQL의에서 외래 키 제약 조건을 비활성화 할 수 있습니다?
그것은 MySQL을 일시적으로 해제 제약 할 수 있습니까?
나는 다른 하나에 외래 키 두 장고 모델, 각이있다. 모델의 인스턴스를 삭제하기 때문에 외래 키 제약의 오류를 반환합니다 :
cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed() #a foreign key constraint fails here
cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()
일시적으로 해제 제약 및 삭제 어쨌든 할 수 있습니까?
해결법
-
==============================
1.DISABLE KEYS를 시도하거나
DISABLE KEYS를 시도하거나
SET FOREIGN_KEY_CHECKS=0;
확인에 확인
SET FOREIGN_KEY_CHECKS=1;
후.
-
==============================
2.다음을 수행, 전 세계적으로 외래 키 제약 조건을 해제하려면 :
다음을 수행, 전 세계적으로 외래 키 제약 조건을 해제하려면 :
SET GLOBAL FOREIGN_KEY_CHECKS=0;
당신이 완료되면 다시 그것을 설정 기억
SET GLOBAL FOREIGN_KEY_CHECKS=1;
경고 : 단일 사용자 모드 유지 보수를 수행하는 경우에만이 작업을 수행해야합니다. 이 데이터 불일치 결과도 모르기 때문에. 당신은 mysqldump는 출력을 이용하여 많은 양의 데이터를 업로드 할 때 예를 들어, 매우 도움이 될 것입니다.
-
==============================
3.나는 일반적으로 단지 비활성화 외래 키 제약 나는 테이블을 절단 할 때, 나는이 대답에 다시 계속오고 있기 때문에이 미래의 나를위한 것입니다 :
나는 일반적으로 단지 비활성화 외래 키 제약 나는 테이블을 절단 할 때, 나는이 대답에 다시 계속오고 있기 때문에이 미래의 나를위한 것입니다 :
SET FOREIGN_KEY_CHECKS=0; TRUNCATE TABLE table; SET FOREIGN_KEY_CHECKS=1;
-
==============================
4.대신 당신의 제약 조건을 비활성화의 영구적 ON DELETE SET NULL의로 수정합니다. 즉 비슷한 일을 수행하고 당신은 켜거나 키 검사를 설정해야하지 않을 것입니다. 그래서 같이 :
대신 당신의 제약 조건을 비활성화의 영구적 ON DELETE SET NULL의로 수정합니다. 즉 비슷한 일을 수행하고 당신은 켜거나 키 검사를 설정해야하지 않을 것입니다. 그래서 같이 :
ALTER TABLE tablename1 DROP FOREIGN KEY fk_name1; //get rid of current constraints ALTER TABLE tablename2 DROP FOREIGN KEY fk_name2; ALTER TABLE tablename1 ADD FOREIGN KEY (table2_id) REFERENCES table2(id) ON DELETE SET NULL //add back constraint ALTER TABLE tablename2 ADD FOREIGN KEY (table1_id) REFERENCES table1(id) ON DELETE SET NULL //add back other constraint
A 본의 읽기 (http://dev.mysql.com/doc/refman/5.5/en/alter-table.html) 및 한이 (http://dev.mysql.com/doc/refman/5.5/en /create-table-foreign-keys.html).
-
==============================
5.전 세계적으로 외래 키 제약 조건 해제하려면 :
전 세계적으로 외래 키 제약 조건 해제하려면 :
SET GLOBAL FOREIGN_KEY_CHECKS = 0;
활성 외래 키 제약 조건에 대한
SET GLOBAL FOREIGN_KEY_CHECKS = 1;
-
==============================
6.phpMyAdmin에있는 아주 간단한 해결책 :
phpMyAdmin에있는 아주 간단한 해결책 :
-
==============================
7.나를 위해 단지 SET FOREIGN_KEY_CHECKS = 0; 충분하지 않았다. 난 여전히 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException을 가졌다.
나를 위해 단지 SET FOREIGN_KEY_CHECKS = 0; 충분하지 않았다. 난 여전히 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException을 가졌다.
나는 ALTER TABLE myTable에 DISABLE KEYS를 추가했다 ;.
그래서:
SET FOREIGN_KEY_CHECKS=0; ALTER TABLE myTable DISABLE KEYS; DELETE FROM myTable; ALTER TABLE myTable ENABLE KEYS; SET FOREIGN_KEY_CHECKS=1;
-
==============================
8.키 필드가 널 (NULL) 인 경우에, 당신은 또한 그것을 삭제하기 전에 null로 값을 설정할 수 있습니다 :
키 필드가 널 (NULL) 인 경우에, 당신은 또한 그것을 삭제하기 전에 null로 값을 설정할 수 있습니다 :
cursor.execute("UPDATE myapp_item SET myapp_style_id = NULL WHERE n = %s", n) transaction.commit_unless_managed() cursor.execute("UPDATE myapp_style SET myapp_item_id = NULL WHERE n = %s", n) transaction.commit_unless_managed() cursor.execute("DELETE FROM myapp_item WHERE n = %s", n) transaction.commit_unless_managed() cursor.execute("DELETE FROM myapp_style WHERE n = %s", n) transaction.commit_unless_managed()
-
==============================
9.phpMyAdmin에에서 여러 행을 선택할 수 있습니다 후 삭제 조치를 클릭 할 수 있습니다. 당신은 삭제 쿼리를 나열하는 화면을 입력합니다, 당신은 외래 키 체크를 체크 해제하고,이를 실행하기 위해 예를 클릭 할 수 있습니다.
phpMyAdmin에에서 여러 행을 선택할 수 있습니다 후 삭제 조치를 클릭 할 수 있습니다. 당신은 삭제 쿼리를 나열하는 화면을 입력합니다, 당신은 외래 키 체크를 체크 해제하고,이를 실행하기 위해 예를 클릭 할 수 있습니다.
이것은 ON DELETE 제한 제약이 있더라도 행을 삭제할 수있게된다.
-
==============================
10.그것은 당신이 할 경우, 데이터베이스가 참조 무결성을 위반되지 않도록하지 않기 때문에, 0으로 외래 키 제약 조건을 설정하는 것은 좋은 생각이 아니다. 이것은 오해의 소지가 있거나 불완전한 데이터, 부정확가 발생할 수 있습니다.
그것은 당신이 할 경우, 데이터베이스가 참조 무결성을 위반되지 않도록하지 않기 때문에, 0으로 외래 키 제약 조건을 설정하는 것은 좋은 생각이 아니다. 이것은 오해의 소지가 있거나 불완전한 데이터, 부정확가 발생할 수 있습니다.
당신은 이유 외래 키를 만들 : 자식 열의 모든 값이 부모 컬럼의 값과 같아야한다 때문이다. 어떤 외래 키 제약 조건이없는 경우, 자식 행이 부정확 한 데이터로 이어질 것 부모 행에없는 값을 가질 수 있습니다.
예를 들어, 당신이 로그인 및 사용자로 계정을 등록해야합니다 모든 학생에게 학생을위한 웹 사이트를 운영한다고 가정 해 보겠습니다. 당신은 기본 키와 같은 사용자 ID와 사용자 ID에 대한 하나 개의 테이블을 가지고; 학생에 대한 다른 테이블 컬럼으로 학생 ID로, 계정. 모든 학생이 사용자 ID가 있어야하기 때문에,이 학생이 테이블을 외부 키를 계정에서 학생 ID를 만들기 위해 나을 그 사용자 ID 테이블에 참조 기본 키의 사용자 ID. 어떤 외래 키 확인이없는 경우, 학생은 학생이 잘못 사용자,없이 계정을 얻을 수 있음을 의미 학생 ID없이 사용자 ID를 갖는 끝낼 수 있었다.
이 많은 양의 데이터에 무슨 일이 생기면 상상해보십시오. 당신이 외래 키 확인이 필요한 이유의 그.
이 오류의 원인이 무엇인지 파악하는 것이 가장 좋습니다. 대부분의 경우, 당신은 자식 행에서 삭제하지 않고 상위 행에서 삭제하려고합니다. 상위 행에서 삭제하기 전에 자식 행에서 삭제하십시오.
from https://stackoverflow.com/questions/15501673/how-can-i-temporarily-disable-a-foreign-key-constraint-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 PSQL 출력에서 숨기기 결과 세트 장식에 (0) | 2020.06.28 |
---|---|
[SQL] 분에서 2 날짜 사이의 시간 차이를 계산 (0) | 2020.06.28 |
[SQL] 시간 사이 데이터베이스에 동시 이벤트를 찾기 (0) | 2020.06.28 |
[SQL] PHP에서 "관련 항목"을 찾는 방법 (0) | 2020.06.28 |
[SQL] SQL 쿼리 내에서 단일 인용 탈출 (0) | 2020.06.27 |