programing

테이블을 올바르게 자를 수 있는 방법은 무엇입니까?

iphone6s 2023. 8. 10. 18:35
반응형

테이블을 올바르게 자를 수 있는 방법은 무엇입니까?

루비가 있는 데이터매퍼를 사용하여 특정 테이블에 데이터를 저장하고 있습니다.

일부 표에는 매우 많은 양의 정보가 포함되어 있으며, 사용자가 '데이터베이스 재구성'을 수행할 때 삭제하고 싶습니다(기본적으로 모든 정보를 삭제하고 데이터를 다시 계산함).

나는 원래 Forum.all.destroy를 시도했고 다른 모든 테이블에 대해 그것을 했지만, 나는 그것들 중 일부가 phpmyadmin 내에서 삭제되지 않았다는 것을 알아차렸습니다.저는 외국 열쇠 때문이라는 것만 상상할 수 있습니다.비록 내 다른 테이블의 포어링 키가 성공적으로 삭제되었기 때문에 나는 정말 모릅니다.말할 것도 없이, 키가 비정상적으로 큰 숫자(예: 키 #500,000)에 도달하지 않도록 그냥 '제로'하고 싶습니다.

그런 다음 아래 코드로 실행하려고 했지만 '외부 키 제약' 때문에 테이블이 지워지지 않습니다.서로 의존하는 모든 테이블을 정리하고 있다는 것을 알고 있기 때문에 강제로 작업을 수행하고 싶습니다(두 테이블, 설정 테이블 및 임의 저장 테이블 중 어느 것도 외래 키를 사용하지 않음).

지금까지 전...

adapter = DataMapper.repository(:default).adapter
adapter.execute('TRUNCATE TABLE `forums`, `dates`, `remarks`');

MySQL 구문이 명백히 잘못된 것을 제외하고는 괜찮습니다.이것이 첫번째 일입니다.

나는 phpmyadmin에서 1개씩 했고 내가 그렇게 했을 때 그것은 나와요.

Cannot truncate a table referenced in a foreign key constraint

계획 A:

SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checking.
TRUNCATE TABLE forums;
TRUNCATE TABLE dates;
TRUNCATE TABLE remarks;
SET FOREIGN_KEY_CHECKS = 1; -- Enable foreign key checking.

계획 B:

먼저 하위 테이블을 잘라낸 다음 상위 테이블을 잘라내야 합니다.

외부 키 검사를 사용하지 않도록 설정하면 정의되지 않은 동작을 유발할 수 있는 제약 조건을 준수하지 않는 행을 테이블에 입력할 위험이 있습니다.

외부 검사 사용 안 함을 사용하는 대신.

당신은 아래 코드를 사용할 수 있습니다.

DELETE FROM forums;
ALTER TABLE forums AUTO_INCREMENT = 1;

DELETE FROM dates;
ALTER TABLE dates AUTO_INCREMENT = 1;

DELETE FROM remarks;
ALTER TABLE remarks AUTO_INCREMENT = 1;

그러면 모든 행이 삭제되고 ID가 1부터 증가합니다.

언급URL : https://stackoverflow.com/questions/8641703/how-do-i-truncate-tables-properly

반응형