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()
일시적으로 제약을 해제하고 삭제할 수 있습니까?
해라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;
제약 조건을 사용하지 않도록 설정하는 대신 설정을 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 명령어를 편집하면 옆에 [Enable foreign key checks]라는 체크박스가 표시됩니다.
- 이 체크박스를 끄고 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;
키 필드가 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()
phpMyAdmin에서는 여러 행을 선택하고 삭제 액션을 클릭할 수 있습니다.삭제 쿼리를 나열하는 화면이 나타납니다.다음과 같습니다.
"외부 키 검사 사용" 확인란을 선택 취소하고 클릭하여 실행하십시오.
그러면 ON DELETE 제약 조건이 있더라도 행을 삭제할 수 있습니다.
외부 키 제약 조건을 0으로 설정하는 것은 좋지 않습니다. 이 경우 데이터베이스가 참조 무결성을 위반하지 않도록 보장할 수 있습니다.이로 인해 부정확하거나 오해의 소지가 있거나 불완전한 데이터가 발생할 수 있습니다.
외부 키를 만드는 이유는 하위 열의 모든 값이 상위 열의 값과 동일해야 하기 때문입니다.외부 키 제약 조건이 없는 경우 자식 행에 부모 행에 없는 값이 있을 수 있으며, 이로 인해 데이터가 부정확해질 수 있습니다.
예를 들어, 학생이 로그인할 수 있는 웹 사이트가 있고 모든 학생이 사용자로 계정을 등록해야 한다고 가정해 보겠습니다.사용자 ID를 프라이머리 키로 하는 사용자 ID 테이블과 학생 ID를 컬럼으로 하는 학생 계정 테이블이 있습니다.모든 학생은 사용자 ID를 가지고 있어야 하므로 학생 계정 테이블의 학생 ID를 사용자 ID 테이블의 기본 키 사용자 ID를 참조하는 외부 키로 만드는 것이 좋습니다.외부 키 검사가 없으면 학생은 학생 ID를 가지고 있고 사용자 ID를 가지고 있지 않을 수 있습니다. 이는 학생이 사용자가 되지 않고도 계정을 얻을 수 있다는 것을 의미하는데, 이는 잘못된 것입니다.
대량의 데이터에 이러한 현상이 발생한다고 가정해 보십시오.그래서 외국 키 확인이 필요한 거예요.
에러의 원인을 파악하는 것이 가장 좋습니다.대부분의 경우 자녀 행에서 삭제하지 않고 부모 행에서 삭제하려고 합니다.부모 행에서 삭제하기 전에 자녀 행에서 삭제해 보십시오.
언급URL : https://stackoverflow.com/questions/15501673/how-can-i-temporarily-disable-a-foreign-key-constraint-in-mysql
'source' 카테고리의 다른 글
| MySQL 데이터베이스를 SQLite 데이터베이스로 내보내기 (0) | 2022.12.31 |
|---|---|
| SQL Chemy: 실제 쿼리 인쇄 (0) | 2022.12.21 |
| Typescript d.ts 파일에 정의된 인터페이스 속성 유형을 재정의하고 있습니다. (0) | 2022.12.21 |
| PHP의 GDlib imagecopyresampled 사용 시 PNG 이미지 투명도를 유지할 수 있습니까? (0) | 2022.12.21 |
| 열이 많은 레코드를 MariaDB Columnstore 테이블에 삽입하는 데 시간이 오래 걸립니다. (0) | 2022.12.21 |
