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