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;