it-swarm.com.de

MariaDB: Fremdschlüsselprüfungen deaktivieren

In MySql verwenden wir diesen Befehl, um eine Tabelle abzuschneiden oder Zeilen zu löschen, wenn dies aufgrund von Fremdschlüsseln normalerweise nicht möglich ist (nur InnoDB):

SET FOREIGN_KEY_CHECKS=0;

In MariaDB wird dieser Befehl zwar akzeptiert, aber nicht ausgeführt.

Die Dokumentation besagt, dass ich stattdessen diese Befehle ausführen muss:

Auf Tabellenbasis:

ALTER TABLE `...` DISABLE KEYS;

oder global:

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

Also habe ich versucht, dieses Skript auszuführen:

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;

Und das führt mich zu:

Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl (database.region, CONSTRAINT FK_F62F176F92F3E70 UNBEKANNTER SCHLÜSSEL (country_id) REFERENZEN country (id))

Die Verwendung von TRUNCATE hat den gleichen Effekt.

Wenn Sie eine Idee haben, was ich möglicherweise verpasst habe, bedanken Sie sich im Voraus. Weil die Dokumentation und die vorhandenen Fragen hier nicht viel geholfen haben.

7
Ninj

Es sollte funktionieren mit:

SET FOREIGN_KEY_CHECKS=0

Ich habe folgendes versucht:

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

Das Problem liegt also nicht bei MariaDB, sondern bei PhpMyAdmin. Auf den Seiten, auf denen Sie SQL ausführen können, befindet sich ein Kontrollkästchen, das SET FOREIGN_KEY_CHECKS= Überschreibt. Man muss es deaktivieren, wenn man die Fremdschlüsselvalidierung deaktivieren möchte.

9
Lennart

Wir hatten ein ähnliches Problem bei der Verwendung von MariaDB4j mit Hibernate- und C3P0-Verbindungspooling.

Das Deaktivieren von Fremdschlüsseln mit SET FOREIGN_KEY_CHECKS=0; Scheint nicht zu funktionieren, wenn das C3P0-Verbindungspooling mit mehreren Verbindungen verwendet wird. Das Deaktivieren von Fremdschlüsseln funktionierte einwandfrei, nachdem die Anzahl der Verbindungen auf 1 begrenzt wurde. Wir mussten die folgenden Eigenschaften in der Datei hibernate.properties Festlegen:

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