web-dev-qa-db-ja.com

MariaDB:外部キーのチェックを無効にする

MySqlでは、外部キーのために通常は不可能であるときにテーブルを切り捨てるか、行を削除するために(InnoDBのみ)、次のコマンドを使用します。

SET FOREIGN_KEY_CHECKS=0;

MariaDBでは、このコマンドは受け入れられますが、何も実行されません。

documentation は代わりにこれらのコマンドを実行する必要があると言います:

テーブルごと:

ALTER TABLE `...` DISABLE KEYS;

または、グローバルに:

SET @@session.unique_checks = 0;
SET @@session.foreign_key_checks = 0;

だから私はこのスクリプトを実行しようとしました:

SET FOREIGN_KEY_CHECKS=0;
SET @@session.unique_checks = 0;
SET @@session.foreign_key_checks = 0;
ALTER TABLE `country` DISABLE KEYS;
DELETE FROM `country` WHERE 1;

そしてそれは私につながる:

親行を削除または更新できません:外部キー制約が失敗します(database.region、CONSTRAINT FK_F62F176F92F3E70 外部キー (country_id)リファレンスcountryid))

TRUNCATEを使用しても同じ効果があります。

私が逃したかもしれないことについて何か考えがあれば、事前に感謝します。ドキュメントと既存の質問はここではあまり役に立ちませんでした。

7
Ninj

それは動作するはずです:

SET FOREIGN_KEY_CHECKS=0

私は以下を試しました:

create table parent (x int not null primary key) engine = innodb;
create table child (x int not null primary key, constraint aaa foreign key (x) references parent (x) on delete restrict) engine = innodb;
insert into parent (x) values (1),(2);

-- test if f.k is active
insert into child (x) values (1),(3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails ("test"."child", CONSTRAINT "aaa" FOREIGN KEY ("x") REFERENCES "parent" ("x"))

insert into child (x) values (1);
SET FOREIGN_KEY_CHECKS=0;
delete from parent;
select * from parent;
Empty set (0.00 sec)

select * from child;
+---+
| x |
+---+
| 1 |
+---+

select @@version
-> ;
+-----------------+
| @@version       |
+-----------------+
| 10.1.16-MariaDB |
+-----------------+

したがって、問題はMariaDBではなく、PhpMyAdminにあります。 SQLを実行できるページにチェックボックスがあり、SET FOREIGN_KEY_CHECKS=をオーバーライドします。外部キーの検証を無効にする場合は、チェックを外す必要があります。

9
Lennart

HibernateおよびC3P0接続プーリングでMariaDB4jを使用しているときに、同様の問題が発生しました。

複数の接続でC3P0接続プールを使用している場合、SET FOREIGN_KEY_CHECKS=0;で外部キーを無効にしても機能しないようです。接続数を1に制限した後、外部キーの無効化は完全に機能しました。hibernate.propertiesファイルで次のプロパティを設定する必要がありました。

connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider
hibernate.c3p0.min_size=1
hibernate.c3p0.max_size=1
1
jjoller