source

MYSQL 데이터베이스의 모든 외부 키 삭제

manycodes 2023. 8. 29. 20:45
반응형

MYSQL 데이터베이스의 모든 외부 키 삭제

외부 키로 인해 데이터베이스 구조를 새로운 요구 사항에 맞게 수정하는 데 너무 많은 문제가 발생했습니다. 기본 키를 수정하고 싶지만 외부 키가 해당 테이블을 참조할 때는 수정할 수 없는 것 같습니다(MySQL이 테이블을 삭제하고 다시 만들기 때문인 것 같습니다.

그래서 DB 작업을 하는 동안 외부 키를 모두 제거하고 나중에 다시 만들고 싶습니다.그렇게 하는 깔끔한 방법이 있습니까?

달려.

SELECT concat('ALTER TABLE `', TABLE_NAME, '` DROP FOREIGN KEY `', CONSTRAINT_NAME, '`;') 
FROM information_schema.key_column_usage 
WHERE CONSTRAINT_SCHEMA = 'db_name' 
AND referenced_table_name IS NOT NULL;

출력을 실행합니다.

Alter Table 명령문을 작성하기 전에 다음 명령을 간단히 실행할 수 있습니다.

SET foreign_key_checks = 0;

이렇게 하면 데이터베이스 연결에 대한 외부 키 제약 조건 검사가 해제됩니다.그런 다음 제약에 대해 걱정할 필요 없이 변경할 수 있습니다.

작업을 완료한 후에는 다음 사항을 잊지 마십시오.

SET foreign_key_checks = 1;

그들을 다시 켜는 것.

이렇게 해도 열 데이터 유형이 일치하지 않기 때문에 실패하는 새 외부 키 제약 조건을 만들 수 없습니다.

Zoozy 코드의 다른 버전에서는 테이블만 선택할 수 있습니다.

SELECT concat('ALTER TABLE ', TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';') 
FROM information_schema.key_column_usage 
WHERE CONSTRAINT_SCHEMA = 'YOUR DB HERE' 
AND TABLE_NAME='YOUR TABLE HERE' 
AND REFERENCED_TABLE_NAME IS NOT NULL;

절차와 함께:

DROP PROCEDURE IF EXISTS dropForeignKeysFromTable;

delimiter ///
create procedure dropForeignKeysFromTable(IN param_table_schema varchar(255), IN param_table_name varchar(255))
begin
    declare done int default FALSE;
    declare dropCommand varchar(255);
    declare dropCur cursor for 
        select concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name, ';') 
        from information_schema.table_constraints
        where constraint_type='FOREIGN KEY' 
            and table_name = param_table_name
            and table_schema = param_table_schema;

    declare continue handler for not found set done = true;

    open dropCur;

    read_loop: loop
        fetch dropCur into dropCommand;
        if done then
            leave read_loop;
        end if;

        set @sdropCommand = dropCommand;

        prepare dropClientUpdateKeyStmt from @sdropCommand;

        execute dropClientUpdateKeyStmt;

        deallocate prepare dropClientUpdateKeyStmt;
    end loop;

    close dropCur;
end///

여러 데이터베이스에 걸쳐 동일한 테이블을 수행하려면 다음을 저장하는 것을 잊지 마십시오.CONSTRAINT_SCHEMA출력:

SELECT concat('ALTER TABLE ', CONSTRAINT_SCHEMA,'.',TABLE_NAME, ' DROP FOREIGN KEY ', CONSTRAINT_NAME, ';')
FROM information_schema.key_column_usage
WHERE CONSTRAINT_SCHEMA like 'your_db_prefix_%'
    AND TABLE_NAME='your_table'
    AND REFERENCED_TABLE_NAME IS NOT NULL;

언급URL : https://stackoverflow.com/questions/13733281/drop-all-foreign-keys-in-mysql-database

반응형