programing

외국 키가 있는 경우에만 삭제

css3 2023. 10. 17. 20:26

외국 키가 있는 경우에만 삭제

MySQL 데이터베이스에 있습니다.

이렇게 하고 있는데 안 돼요.

ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;

나는 내가 할 수 있는 모든 곳에 이것이 존재한다면 하려고 노력했습니다.외국인 키가 존재하는지를 확인한 후 드롭할 수 있는 방법은?

외부 키가 있는 경우 삭제하고 프로시저를 사용하지 않으려면 다음과 같은 방법으로 수행할 수 있습니다(MySQL의 경우).

set @var=if((SELECT true FROM information_schema.TABLE_CONSTRAINTS WHERE
            CONSTRAINT_SCHEMA = DATABASE() AND
            TABLE_NAME        = 'table_name' AND
            CONSTRAINT_NAME   = 'fk_name' AND
            CONSTRAINT_TYPE   = 'FOREIGN KEY') = true,'ALTER TABLE table_name
            drop foreign key fk_name','select 1');

prepare stmt from @var;
execute stmt;
deallocate prepare stmt;

외국 키가 있으면 변수에 변경 가능한 문을 넣고 없으면 더미 문을 넣습니다.그런 다음에 실행합니다.

재사용성을 높이려면 저장 프로시저를 사용하는 것이 좋습니다.원하는 DB에서 다음 코드를 한 번 실행합니다.

   DROP PROCEDURE IF EXISTS PROC_DROP_FOREIGN_KEY;
    DELIMITER $$
    CREATE PROCEDURE PROC_DROP_FOREIGN_KEY(IN tableName VARCHAR(64), IN constraintName VARCHAR(64))
    BEGIN
        IF EXISTS(
            SELECT * FROM information_schema.table_constraints
            WHERE 
                table_schema    = DATABASE()     AND
                table_name      = tableName      AND
                constraint_name = constraintName AND
                constraint_type = 'FOREIGN KEY')
        THEN
            SET @query = CONCAT('ALTER TABLE ', tableName, ' DROP FOREIGN KEY ', constraintName, ';');
            PREPARE stmt FROM @query; 
            EXECUTE stmt; 
            DEALLOCATE PREPARE stmt; 
        END IF; 
    END$$
    DELIMITER ;

그 후 언제든지 이 내용을 바꿀 수 있습니다.

ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;

이 경우:

CALL PROC_DROP_FOREIGN_KEY('object', 'object_ibfk_1');

그러면 스크립트가 원활하게 실행될 것입니다.object_ibfk_1실제로 존재하든 그렇지 않든.

많은 공로: http://simpcode.blogspot.com.ng/2015/03/mysql-drop-foreign-key-if-exists.html

IF EXISTS(
              SELECT *
              FROM INFORMATION_SCHEMA.STATISTICS
              WHERE INDEX_SCHEMA = DATABASE()
                    AND TABLE_NAME='myTable'
                    AND INDEX_NAME = 'myIndex')
        THEN

            ALTER TABLE `myTable` DROP FOREIGN KEY `myForeignKey`;

            ALTER TABLE `myTable` DROP INDEX `myIndex` ;

        END IF;

외부 키 제약 조건을 생성하면 참조된 열에 mysql이 인덱스를 자동으로 생성합니다.위의 예는 INFORMATION_SCHEMA에서 인덱스를 확인하는 방법을 보여주지만, 정보 스키마에서 확인할 수 있는 정보가 훨씬 더 많습니다.인덱스 이름이 FK용으로 생성되었음을 나타내는 것 같으니 FK를 먼저 삭제한 후 인덱스를 삭제해야 합니다.외부 키를 다시 생성하면 mysql에서 인덱스를 다시 생성합니다.테이블 스캔을 수행하지 않고도 참조 무결성을 적용할 수 있는 인덱스가 필요합니다.

동일한 열을 포함하는 새 인덱스를 만들려는 경우 먼저 해당 인덱스를 만들어야 합니다(이 열을 사용하면 FK로 사용되며 인덱스에 대해 지정된 열 목록에서 첫 번째가 됨).이제 FK를 다시 추가할 수 있고 mysql은 다른 인덱스를 만들지 않고 새로운 인덱스를 사용할 수 있습니다.

편집: 인덱스를 빠르게 보려면 단순히 SHOW INDES FROM myTable을 실행하기만 하면 됩니다.

Mariadb 10.1.26(새로운 Mysql)의 최신 버전에서는 다음과 같이 쿼리가 작동합니다.

키:MUL

ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;
DESC `object`;

키:<NULL>

사용 중인 데이터베이스는 무엇입니까?

SQL 서버인 경우

if exists (select 1 from sys.objects where object_id = OBJECT_ID(N'[FKName]') AND      
parent_object_id = OBJECT_ID('TableName'))
alter table TableName drop constraint FKName

여기에 다음과 같은 해결 방법이 있습니다.DROP FOREIGN KEY IF EXISTS, 이전 MySQL 버전과 MariaDB 버전에는 없습니다.v10.1.4. 당신은 또한 당신이 원하는 모든 다른 진술에 그것을 사용할 수 있습니다, 그것은 그것의 존재에 달려 있어야 합니다.FOREIGN KEY(예를 들어 을 위해)SELECT "info: foreign key exists."아래의 예와 같이).

-- DROP FOREIGN KEY IF EXISTS
SELECT
    COUNT(*)
INTO
    @FOREIGN_KEY_my_foreign_key_ON_TABLE_my_table_EXISTS
FROM
    `information_schema`.`table_constraints`
WHERE
    `table_schema` = 'my_database'
    AND `table_name` = 'my_table'
    AND `constraint_name` = 'my_foreign_key'
    AND `constraint_type` = 'FOREIGN KEY'
;
-- SELECT @FOREIGN_KEY_my_foreign_key_ON_TABLE_my_table_EXISTS;
SET @statement := IF(
    @FOREIGN_KEY_my_foreign_key_ON_TABLE_my_table_EXISTS > 0,
    -- 'SELECT "info: foreign key exists."',
    'ALTER TABLE my_table DROP FOREIGN KEY my_foreign_key',
    'SELECT "info: foreign key does not exist."'
);
PREPARE statement FROM @statement;
EXECUTE statement;

비슷한 논의:sql 서버에 있는 경우에만 외부 키 제약 조건을 삭제하려면 어떻게 해야 합니까?

IF (OBJECT_ID('FK_ConstraintName', 'F') IS NOT NULL)

매우 유용하고 아직 여기서 언급되지 않았습니다.

언급URL : https://stackoverflow.com/questions/17161496/drop-foreign-key-only-if-it-exists