외부 키 제약 테이블을 잘라내는 방법
TRUNCATE가 켜지지 않는 이유mygroup
가 ?? work ? work work work work work work work work work work work work work ?ON DELETE CASCADE SET
ERROR 1701(42000): 키 「 」 )으로 참조되고 있는 테이블을 수 없습니다.
mytest
.instance
, 제 , , , ,instance_ibfk_1
키Foreign Key)GroupID
mytest
.mygroup
)ID
drop database mytest;
create database mytest;
use mytest;
CREATE TABLE mygroup (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE instance (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
GroupID INT NOT NULL,
DateTime DATETIME DEFAULT NULL,
FOREIGN KEY (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE,
UNIQUE(GroupID)
) ENGINE=InnoDB;
네, 다음 작업을 수행할 수 있습니다.
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
TRUNCATE table2;
SET FOREIGN_KEY_CHECKS = 1;
으로 인해, 이 들어갈 이 있고, 그 이 이 문장에 이 있습니다.FOREIGN KEY
★★★★★★ 。
수 없다TRUNCATE
FK )이 적용된 테이블(FK 구속)TRUNCATE
않다DELETE
를 참조해 주세요.
이 문제를 해결하려면 다음 솔루션 중 하나를 사용하십시오.둘 다 데이터 무결성을 손상시킬 위험이 있습니다.
옵션 1:
- 제약 조건 제거
- 실행하다
TRUNCATE
- 현재 참조가 있는 행을 수동으로 삭제합니다.
- 제약 조건 작성
옵션 2: 사용자 447951이 응답에서 제안했습니다.
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;
다음과 같이 간단하게 실행할 수 있습니다.
DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
phpMyAdmin을 사용하는 경우 간단합니다.
꺼주세요.Enable foreign key checks
[ ] 아래에 SQL
""를 실행합니다.TRUNCATE <TABLE_NAME>
할수있습니다
DELETE FROM `mytable` WHERE `id` > 0
MYSQL 데이터베이스에서 테스트 완료
해결책 1:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
해결책 2:
DELETE FROM table1;
ALTER TABLE table1 AUTO_INCREMENT = 1;
TRUNCATE table1;
난 이거면 돼.이것이 당신에게도 도움이 되기를 바랍니다.질문해 주셔서 감사합니다.
mysql 문서에 따르면 TRUNCATE는 외부 키 관계가 있는 테이블에서는 사용할 수 없습니다.AFAIK를 완전히 대체할 수 있는 것은 없다.
제약 조건을 해제해도 여전히 ON DELETE 및 ON UPDATE가 호출되지 않습니다.ATM에서 생각할 수 있는 유일한 해결책은 다음 중 하나입니다.
- 모든 행 삭제, 외부 키 삭제, 잘라내기, 키 재생성
- 모든 행 삭제, auto_display 리셋(사용하는 경우)
MySQL의 TRUNCATE는 아직 완전한 기능이 아닌 것 같습니다(트리거도 호출하지 않습니다).
코멘트 참조
이 질문에 대해서는 몰랐지만, phpMyAdmin을 사용하면 데이터베이스를 열고 잘라낼 테이블을 선택할 수 있습니다.
- 하단에는 다양한 옵션이 있는 드롭다운이 있습니다. [ ]를 선택합니다.
Empty
" " "라는 제목Delete data or table
. - 하며, 인 '다음에 간다'가 있습니다.
Enable foreign key checks
하고 '만들기'를 누르기만 하면 됩니다Yes
버튼과 선택한 테이블이 잘립니다.
사용자 447951의 답변에서 제안된 쿼리를 내부적으로 실행할 수도 있지만 phpMyAdmin 인터페이스에서 사용하는 것은 매우 편리합니다.
정답은 옵션1에 기재되어 있듯이 zerkms에 의해 제공되는 것입니다.
옵션 1: 데이터 무결성에 손상을 줄 위험이 없습니다.
- 제약 조건 제거
- 잘라내기 실행
- 현재 참조가 있는 행을 수동으로 삭제합니다.
- 제약 조건 작성
어려운 부분은 구속을 없애는 것입니다.누군가 그 방법을 알아야 할 경우를 대비해서 말씀드리도록 하겠습니다.
달려.
SHOW CREATE TABLE <Table Name>
외부 키의 이름을 확인하기 위한 쿼리(아래 이미지의 빨간색 프레임):달려.
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. 그러면 외부 키 제약이 제거됩니다.테이블 구조 페이지를 통해 관련 인덱스를 드롭하면 완료됩니다.
외부 키를 재생성하려면:
ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
또 다른 회피책은 테이블의 모든 행을 삭제하고 자동 증분 열을 재설정하는 것입니다.
delete from table_name where 1
다음 실행:
ALTER TABLE table_name AUTO_INCREMENT = 1
외부 키 제약 테이블을 잘라내는 방법이 그림에서는 외부 키 제약이 있는 테이블을 잘라내는 경우의 mysql 오류를 해결하는 방법을 보여 줍니다.PHPMYADMIN을 사용하는 경우 외부 키 제약으로 테이블을 쉽게 잘라낼 수 있습니다.
- PHPMYADMIN에 로그인하고 잘라낼 테이블을 클릭합니다.
- 그런 다음 SQL 탭으로 이동합니다. SQL Editor 예제에서 테이블을 잘라낼 코드를 배치합니다. 학생을 테이블의 이름으로 바꿉니다.
- 에디터 하단의 [Enable foreign key checks]체크박스를 끄겠습니다
마법처럼 잘 될 거야.
캐스케이드만 사용
TRUNCATE "products" RESTART IDENTITY CASCADE;
단, 캐스케이드 삭제에 대비하십시오.)
laravel migration을 사용하고 있는 경우는, facades helper를 사용해 이것을 실행할 수 있습니다.
웅변적인 오브젝트를 사용하는 것을 선호하며, "Eloquent" 방식으로 대답한다.
Schema::disableForeignKeyConstraints();
Teacher::truncate();
Schema::enableForeignKeyConstraints();
Larabel 7 및 8에서는 4개의 데이터베이스(MySql, Postgres, SQLite 및 SQLServer) 간에 호환성이 있으며, 웅변적인 기능은 사용하지 않습니다.
Schema::disableForeignKeyConstraints();
DB::table('teachers')->truncate();
Schema::enableForeignKeyConstraints();
모델을 데이터베이스와 동기화하면서 Mysql Workbench와 같이 이전 외부 키 검사 상태 및 SQL 모드를 가져오는 것이 테이블을 잘라내거나 삭제하는 가장 좋은 방법입니다.
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;`
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
테이블용 데이터베이스 엔진이 다를 경우 이 오류가 발생하므로 InnoDB로 변경하십시오.
ALTER TABLE my_table ENGINE = InnoDB;
언급URL : https://stackoverflow.com/questions/5452760/how-to-truncate-a-foreign-key-constrained-table
'programing' 카테고리의 다른 글
스핑크스의 자동화가 불충분하다 (0) | 2023.01.15 |
---|---|
Android 응용 프로그램의 QR 코드를 생성하는 방법은 무엇입니까? (0) | 2023.01.15 |
mysql.connector python prepared 문이 byearray에 문자열을 반환하는 이유 (0) | 2023.01.15 |
컬렉션이 필요한 이유정렬은 Mergesort를 사용하지만 Arrays를 사용합니다.정렬은 안 되나요? (0) | 2023.01.15 |
CASE 또는 IF ELESSIF를 사용하는 MySQL select 문을 선택하십시오.결과를 얻는 방법을 잘 모르겠습니다. (0) | 2023.01.15 |