[mysql] MySQL에서 외래 키 제약 조건을 일시적으로 비활성화하는 방법은 무엇입니까?

MySQL에서 제약 조건을 일시적으로 비활성화 할 수 있습니까?

두 개의 장고 모델이 있는데, 각각 다른 하나에 ForeignKey가 있습니다. 모델의 인스턴스를 삭제하면 ForeignKey 제약 조건으로 인해 오류가 반환됩니다.

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()

제약 조건을 일시적으로 비활성화하고 어쨌든 삭제할 수 있습니까?



답변

시도 DISABLE KEYS또는

SET FOREIGN_KEY_CHECKS=0;

확인

SET FOREIGN_KEY_CHECKS=1;

후.


답변

외래 키 제약 조건을 전체적으로 끄려면 다음을 수행하십시오.

SET GLOBAL FOREIGN_KEY_CHECKS=0;

완료되면 다시 설정해야합니다.

SET GLOBAL FOREIGN_KEY_CHECKS=1;

경고 : 단일 사용자 모드 유지 관리를 수행 할 때만이 작업을 수행해야합니다. 데이터 불일치가 발생할 수 있습니다. 예를 들어, mysqldump 출력을 사용하여 많은 양의 데이터를 업로드 할 때 매우 유용합니다.


답변

나는 일반적으로 테이블을 자르고 싶을 때 외래 키 제약 조건 만 비활성화 하고이 대답으로 계속 돌아 가기 때문에 이것은 나에게 미래입니다.

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE table;
SET FOREIGN_KEY_CHECKS=1;


답변

제약 조건을 비활성화하는 대신 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

이것 ( 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 ).


답변

외래 키 제약 조건을 전체적으로 끄려면

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

활성 외래 키 제약 조건

SET GLOBAL FOREIGN_KEY_CHECKS = 1;


답변

phpmyadmin을 사용한 매우 간단한 솔루션 :

  • 표에서 SQL탭으로 이동
  • 실행하려는 SQL 명령을 편집 한 후 옆에 GO외래 키 검사 사용 ‘이라는 확인란이 있습니다 .
  • 이 확인란의 선택을 취소하고 SQL을 실행하십시오 . 실행 후 자동으로 다시 확인됩니다.

답변

나를 위해 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;