복붙노트

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

    1.DISABLE KEYS를 시도하거나

    DISABLE KEYS를 시도하거나

    SET FOREIGN_KEY_CHECKS=0;
    

    확인에 확인

    SET FOREIGN_KEY_CHECKS=1;
    

    후.

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

    2.다음을 수행, 전 세계적으로 외래 키 제약 조건을 해제하려면 :

    다음을 수행, 전 세계적으로 외래 키 제약 조건을 해제하려면 :

    SET GLOBAL FOREIGN_KEY_CHECKS=0;
    

    당신이 완료되면 다시 그것을 설정 기억

    SET GLOBAL FOREIGN_KEY_CHECKS=1;
    

    경고 : 단일 사용자 모드 유지 보수를 수행하는 경우에만이 작업을 수행해야합니다. 이 데이터 불일치 결과도 모르기 때문에. 당신은 mysqldump는 출력을 이용하여 많은 양의 데이터를 업로드 할 때 예를 들어, 매우 도움이 될 것입니다.

  3. ==============================

    3.나는 일반적으로 단지 비활성화 외래 키 제약 나는 테이블을 절단 할 때, 나는이 대답에 다시 계속오고 있기 때문에이 미래의 나를위한 것입니다 :

    나는 일반적으로 단지 비활성화 외래 키 제약 나는 테이블을 절단 할 때, 나는이 대답에 다시 계속오고 있기 때문에이 미래의 나를위한 것입니다 :

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

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

    5.전 세계적으로 외래 키 제약 조건 해제하려면 :

    전 세계적으로 외래 키 제약 조건 해제하려면 :

    SET GLOBAL FOREIGN_KEY_CHECKS = 0;
    

    활성 외래 키 제약 조건에 대한

    SET GLOBAL FOREIGN_KEY_CHECKS = 1;
    
  6. ==============================

    6.phpMyAdmin에있는 아주 간단한 해결책 :

    phpMyAdmin에있는 아주 간단한 해결책 :

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

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

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

    9.phpMyAdmin에에서 여러 행을 선택할 수 있습니다 후 삭제 조치를 클릭 할 수 있습니다. 당신은 삭제 쿼리를 나열하는 화면을 입력합니다, 당신은 외래 키 체크를 체크 해제하고,이를 실행하기 위해 예를 클릭 할 수 있습니다.

    phpMyAdmin에에서 여러 행을 선택할 수 있습니다 후 삭제 조치를 클릭 할 수 있습니다. 당신은 삭제 쿼리를 나열하는 화면을 입력합니다, 당신은 외래 키 체크를 체크 해제하고,이를 실행하기 위해 예를 클릭 할 수 있습니다.

    이것은 ON DELETE 제한 제약이 있더라도 행을 삭제할 수있게된다.

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

    10.그것은 당신이 할 경우, 데이터베이스가 참조 무결성을 위반되지 않도록하지 않기 때문에, 0으로 외래 키 제약 조건을 설정하는 것은 좋은 생각이 아니다. 이것은 오해의 소지가 있거나 불완전한 데이터, 부정확가 발생할 수 있습니다.

    그것은 당신이 할 경우, 데이터베이스가 참조 무결성을 위반되지 않도록하지 않기 때문에, 0으로 외래 키 제약 조건을 설정하는 것은 좋은 생각이 아니다. 이것은 오해의 소지가 있거나 불완전한 데이터, 부정확가 발생할 수 있습니다.

    당신은 이유 외래 키를 만들 : 자식 열의 모든 값이 부모 컬럼의 값과 같아야한다 때문이다. 어떤 외래 키 제약 조건이없는 경우, 자식 행이 부정확 한 데이터로 이어질 것 부모 행에없는 값을 가질 수 있습니다.

    예를 들어, 당신이 로그인 및 사용자로 계정을 등록해야합니다 모든 학생에게 학생을위한 웹 사이트를 운영한다고 가정 해 보겠습니다. 당신은 기본 키와 같은 사용자 ID와 사용자 ID에 대한 하나 개의 테이블을 가지고; 학생에 대한 다른 테이블 컬럼으로 학생 ID로, 계정. 모든 학생이 사용자 ID가 있어야하기 때문에,이 학생이 테이블을 외부 키를 계정에서 학생 ID를 만들기 위해 나을 그 사용자 ID 테이블에 참조 기본 키의 사용자 ID. 어떤 외래 키 확인이없는 경우, 학생은 학생이 잘못 사용자,없이 계정을 얻을 수 있음을 의미 학생 ID없이 사용자 ID를 갖는 끝낼 수 있었다.

    이 많은 양의 데이터에 무슨 일이 생기면 상상해보십시오. 당신이 외래 키 확인이 필요한 이유의 그.

    이 오류의 원인이 무엇인지 파악하는 것이 가장 좋습니다. 대부분의 경우, 당신은 자식 행에서 삭제하지 않고 상위 행에서 삭제하려고합니다. 상위 행에서 삭제하기 전에 자식 행에서 삭제하십시오.

  11. from https://stackoverflow.com/questions/15501673/how-can-i-temporarily-disable-a-foreign-key-constraint-in-mysql by cc-by-sa and MIT license