web-dev-qa-db-fra.com

MariaDB: désactiver les vérifications de clés étrangères

Sur MySql, afin de tronquer une table ou supprimer des lignes alors que c'est normalement impossible à cause de clés étrangères (InnoDB uniquement), nous utilisons cette commande:

SET FOREIGN_KEY_CHECKS=0;

Sur MariaDB, bien que cette commande soit acceptée, elle ne fait rien.

Le documentation dit que je dois exécuter ces commandes à la place:

Par table:

ALTER TABLE `...` DISABLE KEYS;

ou, globalement:

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

J'ai donc essayé d'exécuter ce script:

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;

Et cela m'amène à:

Impossible de supprimer ou de mettre à jour une ligne parent: une contrainte de clé étrangère échoue (database.region, CONSTRAINT FK_F62F176F92F3E70 CLÉ ÉTRANGÈRE (country_id) RÉFÉRENCES country (id))

L'utilisation de TRUNCATE a le même effet.

Si vous avez une idée de ce que j'ai pu manquer, merci d'avance. Parce que la documentation et les questions existantes ne nous ont pas beaucoup aidés ici.

7
Ninj

Cela devrait fonctionner avec:

SET FOREIGN_KEY_CHECKS=0

J'ai essayé ce qui suit:

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 |
+-----------------+

Le problème n'est donc pas avec MariaDB, mais avec PhpMyAdmin. Il a une case à cocher sur les pages où vous pouvez exécuter SQL, qui remplace SET FOREIGN_KEY_CHECKS=. Il faut la décocher si l'on veut désactiver la validation de clé étrangère.

9
Lennart

Nous avons rencontré un problème similaire lors de l'utilisation de MariaDB4j avec la mise en commun des connexions Hibernate et C3P0.

Désactiver les clés étrangères avec SET FOREIGN_KEY_CHECKS=0; ne semble pas fonctionner lors de l'utilisation du pool de connexions C3P0 avec plusieurs connexions. La désactivation des clés étrangères a parfaitement fonctionné après avoir limité le nombre de connexions à 1. Nous avons dû définir les propriétés suivantes dans le hibernate.properties fichier:

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