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
, CONSTRAINTFK_F62F176F92F3E70
CLÉ ÉTRANGÈRE (country_id
) RÉFÉRENCEScountry
(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.
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.
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