foreign keys zur Laufzeit aufheben

foreign keys zur Laufzeit aufheben

am 19.08.2006 09:39:08 von Ralph Stahl

Moin,

In einem PHP-Projekt muß ich bei einem größeren insert über mehrere=
=20
Tabellen deren Foreign Keys (Constraints) zeitweilig abschalten. Von der=20
Konsole aus ginge das mit

ALTER TABLE xyz NOCHECK CONSTRAINT ALL

aber das geht wohl nicht zur Laufzeit von PHP aus (führt zwar nicht zum=
=20
fatalen Fehler, bewirkt aber nichts).

Die Alternative ist

SET FOREIGN_KEY_CHECKS =3D 0

und das kann ich auch zur Laufzeit machen. Nur werden damit in der=20
gesamten DB die Constraints abgeschaltet, und das soll nicht sein. KLar=20
vergehen nur ein paar Millisekunden bis zum Wieder-Einschalten, aber die=20
könnten theoretisch reichen für's Chaos.

Um dem abzuhelfen, lege ich um die gesamte Aktion eine Transaction. Aber=20
trotzdem werden ja wohl die Checks über die gesamte DB abgeschaltet,=20
oder?

Wie kann ich das lösen? Frau Google (auch Groups) konnte mir nicht=20
helfen, und meine Bücher auch nicht.

Ralph

Re: foreign keys zur Laufzeit aufheben

am 19.08.2006 11:06:46 von Christian Kirsch

Ralph Stahl schrieb:
> Moin,
>
> In einem PHP-Projekt muß ich bei einem größeren insert über mehrere
> Tabellen deren Foreign Keys (Constraints) zeitweilig abschalten. Von der
> Konsole aus ginge das mit
>
> ALTER TABLE xyz NOCHECK CONSTRAINT ALL
>
> aber das geht wohl nicht zur Laufzeit von PHP aus (führt zwar nicht zum
> fatalen Fehler, bewirkt aber nichts).
>

Warum sollte das nicht gehen? Welcher Unterschied besteht denn zwischen
"von der Konsole abschicken" und "von PHP ausführen lassen"? Ist die
PHP-API derart fehlerhaft (oder featureträchtig), dass sie selbsttätig
entscheidet, welche SQL-Befehle sie an mysqld weiterreicht und welche
sie in die Tonne tritt?

> Wie kann ich das lösen? Frau Google (auch Groups) konnte mir nicht
> helfen, und meine Bücher auch nicht.

Ich vermute, Deine Voraussetzung ist flasch - es sollte keine Befehle
geben, die via mysql (Client) funktionieren, via PHP aber nicht. Es sei
denn, Du sagst PHP, meinst aber diese "Admin"-Krankheit. Vielleicht
hilft ein Blick in den MySQL-Log?

Re: foreign keys zur Laufzeit aufheben

am 20.08.2006 13:57:48 von Thomas Rachel

Ralph Stahl wrote:

> ALTER TABLE xyz NOCHECK CONSTRAINT ALL
>
> aber das geht wohl nicht zur Laufzeit von PHP aus (führt zwar nicht zum
> fatalen Fehler, bewirkt aber nichts).

Was passiert denn, wenn Du den Rückgabewert des entsprechenden
mysql_query()-Aufruf auswertest und ggf. mysql_error() nach Detail
fragst?


Thomas

Re: foreign keys zur Laufzeit aufheben

am 21.08.2006 11:40:59 von Ralph Stahl

Thomas Rachel schrieb:
> Ralph Stahl wrote:
>
>> ALTER TABLE xyz NOCHECK CONSTRAINT ALL
>>
>> aber das geht wohl nicht zur Laufzeit von PHP aus (führt zwar nicht zum
>> fatalen Fehler, bewirkt aber nichts).
>
> Was passiert denn, wenn Du den Rückgabewert des entsprechenden
> mysql_query()-Aufruf auswertest und ggf. mysql_error() nach Detail
> fragst?
>
>
> Thomas

Erstmal kommt schon ein Syntaxfehler, weil das wohl so in mysql 5 nicht
definiert ist laut
http://www.mysqlpress.com/doc/refman/5.1/de/alter-table.html . Diese
Zeile habe ich zwar mehrfach bei Frau Google gefunden, aber lt. Handbuch
gibt es nur DISABLE | ENABLE KEYS, was aber für die Indizes in
myISAM-Tabs gedacht ist. Die obige Zeile gibts beim MS-SQL-Server, das
habe ich übersehen.

Un nu?

Re: foreign keys zur Laufzeit aufheben

am 22.08.2006 06:30:14 von Thomas Rachel

Ralph Stahl wrote:

> Erstmal kommt schon ein Syntaxfehler, weil das wohl so in
> mysql 5 nicht definiert ist laut
> http://www.mysqlpress.com/doc/refman/5.1/de/alter-table.html .

Ach so. Ich dachte, Du hättest den Befehl an der Konsole ausprobiert, und
er hätte funktioniert.

> Un nu?

Keine Ahnung, kenne mich weder mit InnoDB noch mit 5.x aus...


Thomas