sql >> データベース >  >> RDS >> Mysql

mySQL 5でテーブル上のすべての外部キー制約を一度に削除することは可能ですか?

    Bingの回答に似た解決策がありますが、手順で自動的に再利用できるようになるには、さらに1ステップかかります。

    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///
    
    delimiter ;
    

    プリペアドステートメントは一度に1つのステートメントしか処理できないため、プロシージャはカーソルを使用して外部キーをループし、各ドロップを一度に1つずつ実行します。

    テーブルの1つで手順を使用するには、table_schemaとtable_nameを値に置き換えて、次を使用します。

    call dropForeignKeysFromTable('table_schema', 'table_name');
    


    1. UTL_FILE.FREMOVE例:Oracleでファイルを削除する

    2. MySQLに行が存在するかどうかを確認するにはどうすればよいですか? (つまり、メールがMySQLに存在するかどうかを確認します)

    3. Oracleデータベースへの一括挿入:どちらが良いですか:FORカーソルループまたは単純な選択?

    4. テーブルから過去3か月のレコードを取得します