私はMySQLデータベースを使用しています。外部キーが存在する場合のみドロップする
私はこれをやっていますが、動作しません。
ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;
私はこのIF EXISTSをどこにでも置こうとしました。外部キーが削除される前にそれが存在するかどうかを確認する方法はありますか?
私はMySQLデータベースを使用しています。外部キーが存在する場合のみドロップする
私はこれをやっていますが、動作しません。
ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;
私はこのIF EXISTSをどこにでも置こうとしました。外部キーが削除される前にそれが存在するかどうかを確認する方法はありますか?
使用しているデータベースはどれですか?
場合、SQL Server
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
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のインデックスを確認する方法を示していますが、information schemaでチェックアウトするための情報があります。あなたのインデックス名は、それがFKのために作成されたことを示しているようですので、最初にFKを削除してから、インデックスを削除する必要があります。もう一度外部キーを作成すると、mysqlは再びインデックスを作成します。これは、テーブルスキャンを行うことなく、参照整合性を強制するインデックスが必要です。
同じ列を含む新しい索引を作成する場合は、最初にその索引を作成する必要があります(この列は、FKとして使用される列で、索引に指定された列)。これでFKを追加することができ、mysqlは別のインデックスを作成せずに新しいインデックスを使用することができます。
編集:インデックスをすばやく表示するには、SHOW INDEXES FROM myTableを実行します。
あなたはそれが存在する場合は、外部キーをドロップしたいとは、あなたが(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;
我々は、テーブルを変更置く外部キーがある場合変数内のステートメントとそれがない場合は、ダミーステートメントを入れます。そしてそれを実行します。
同様の議論: How do I drop a foreign key constraint only if it exists in sql server?
IF (OBJECT_ID('FK_ConstraintName', 'F') IS NOT NULL)
は非常に有用であり、まだここでは触れられていません。
再利用性を高めるには、実際にはストアドプロシージャを使用することをお勧めします。ご希望の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 ;
その後、あなたは常にこの置き換えることができます:あなたのスクリプトは、実際にobject_ibfk_1
かどうかをスムーズに実行する必要があります
CALL PROC_DROP_FOREIGN_KEY('object', 'object_ibfk_1');
:これで
ALTER TABLE `object` DROP FOREIGN KEY IF EXISTS `object_ibfk_1`;
を存在するか否かを判断する。
に起因する信用の多く
: http://simpcode.blogspot.com.ng/2015/03/mysql-drop-foreign-key-if-exists.html
アムMYSQLを使用しては、私はどこに私ができるこのIF EXISTSを入れてみました。外部キーが削除される前にそれが存在するかどうかを確認する方法はありますか? – Creditto
あなたはどのmysqlストレージエンジンを使用していますか? MYISAMまたはINNODB ??あなたはMYISAMを使用していないと確信していますか? –
午前INNODBストレージエンジンをmysqlで使用していますが、私はどこでもこのIF EXISTSを置こうとしました。外部キーが削除される前にそれが存在するかどうかを確認する方法はありますか? – Creditto