Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 06.02.2007 09:31:37 von Zsolt Koppany

Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

Hi,

Ich habe eine Tabelle in der Rekorden sind die eigentlich nicht vorkommen
dürften.

Solche Rekorde wurden wahrscheinlich eingeführt als noch kein FOREIGN KEY
existierte.

Ich habe versucht mit mysqlcheck die Tabellen zu reparieren aber dieses Tool
meldet keine Probleme.

Was ich versuche:

Ich selektiere Rekorde in denen tracker_id z.B. 123 ist und bekomme in
role_id Werte die in der Tabelle acl_role nicht mehr vorhanden sind (z.B.
2222). Wenn ich versuche ein INSERT durchzuführen mit dem neuen tracker_id
z.B. 999 und role_id 2222 werde ich (natürlich) einen Fehler bekommen weil
id 2222 in acl_role nicht mehr existier ist.

Mit welchem Tool kann ich ein DB data integrity durchführen?

Das ist die Fehlermeldung die ich beim INSERT bekomme:

Cannot add or update a child row: a foreign key constraint fails
(`codebeamer/task_config_permission`,
CONSTRAINT `task_config_permission_ibfk_1` FOREIGN KEY (`role_id`)
REFERENCES `acl_role` (`id`) ON DELETE CASCADE)

Zsolt

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 06.02.2007 09:33:04 von Zsolt Koppany

Ich benutze 5.0.27-community-nt auf Windows XP.

Zsolt

"Zsolt Koppany" schrieb im Newsbeitrag
news:eq9edc$tn$03$1@news.t-online.com...
> Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?
>
> Hi,
>
> Ich habe eine Tabelle in der Rekorden sind die eigentlich nicht vorkommen
> dürften.
>
> Solche Rekorde wurden wahrscheinlich eingeführt als noch kein FOREIGN KEY
> existierte.
>
> Ich habe versucht mit mysqlcheck die Tabellen zu reparieren aber dieses
> Tool meldet keine Probleme.
>
> Was ich versuche:
>
> Ich selektiere Rekorde in denen tracker_id z.B. 123 ist und bekomme in
> role_id Werte die in der Tabelle acl_role nicht mehr vorhanden sind (z.B.
> 2222). Wenn ich versuche ein INSERT durchzuführen mit dem neuen tracker_id
> z.B. 999 und role_id 2222 werde ich (natürlich) einen Fehler bekommen weil
> id 2222 in acl_role nicht mehr existier ist.
>
> Mit welchem Tool kann ich ein DB data integrity durchführen?
>
> Das ist die Fehlermeldung die ich beim INSERT bekomme:
>
> Cannot add or update a child row: a foreign key constraint fails
> (`codebeamer/task_config_permission`,
> CONSTRAINT `task_config_permission_ibfk_1` FOREIGN KEY (`role_id`)
> REFERENCES `acl_role` (`id`) ON DELETE CASCADE)
>
> Zsolt
>
>

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 06.02.2007 09:53:20 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 06.02.2007 09:55:42 von Florian Laws

On 2007-02-06, Zsolt Koppany wrote:
> Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?
>
> Hi,
>
> Ich habe eine Tabelle in der Rekorden sind die eigentlich nicht vorkommen
> dürften.
>
> Solche Rekorde wurden wahrscheinlich eingeführt als noch kein FOREIGN KEY
> existierte.
>
> Ich habe versucht mit mysqlcheck die Tabellen zu reparieren aber dieses Tool
> meldet keine Probleme.
>
> Was ich versuche:
>
> Ich selektiere Rekorde in denen tracker_id z.B. 123 ist und bekomme in
> role_id Werte die in der Tabelle acl_role nicht mehr vorhanden sind (z.B.
> 2222). Wenn ich versuche ein INSERT durchzuführen mit dem neuen tracker_id
> z.B. 999 und role_id 2222 werde ich (natürlich) einen Fehler bekommen weil
> id 2222 in acl_role nicht mehr existier ist.
>
> Mit welchem Tool kann ich ein DB data integrity durchführen?

Mit eigenen SQL-Statements?

Alle Zeilen selektieren, die in role_id einen ungültigen Wert haben,
und diesen dann durch einen korrekten Wert ersetzen.

Grüße,

Florian
P.S.: Es hilft, wenn Du die Tabellendefinitionen mit angibst.

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 06.02.2007 11:04:41 von Andreas Scherbaum

Andreas Kretschmer wrote:
> begin Zsolt Koppany schrieb:
>>
>> Ich habe eine Tabelle in der Rekorden sind die eigentlich nicht vorkommen
>> dürften.
>>
>> Solche Rekorde wurden wahrscheinlich eingeführt als noch kein FOREIGN KEY
>> existierte.
>
> MySQL 5.0.x erlaubt einen ForeignKey-Constraint zu definieren, wenn in
> der table Records sind, die dagegen verstoßen?

Nun, wenn man bloss den Foreign Key definiert, ohne zu prüfen, ob die Daten
den Bedingungen auch zu entsprechen, geht das schon.
Sollte mal im Source wühlen gehen ...


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 06.02.2007 12:23:27 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 06.02.2007 12:34:07 von Christian Kirsch

Am 06.02.2007 12:23 schrieb Andreas Kretschmer:
>
> test=# create table master (id int primary key, name text);
> NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "master_pkey" for table "master"
> CREATE TABLE
> test=*# create table detail (id int, name text);
> CREATE TABLE
> test=*# insert into master values (1, 'master1');
> INSERT 0 1
> test=*# insert into detail values (2, 'detail2');
> INSERT 0 1
> test=*# commit;
> COMMIT
> test=# alter table detail add constraint fk foreign key (id) references master(id);
> ERROR: insert or update on table "detail" violates foreign key constraint "fk"
> DETAIL: Key (id)=(2) is not present in table "master".
> test=!#
>
>
> Wenn das bei MySQL ohne Fehler abgeht, dann ist die Aussage, daß
> referentielle Integrität unterstützt wird, schlicht eine Lüge. Daher
> meine Frage, ob das *wirklich* geht.
>

Jein. AFAIR gibt es referenzielle Integrität nur bei InnoDB-Tabellen
(man möge mich ggfs. korrigieren). Andere Tabellen-Engines akzeptieren
zwar die Constraints im CREATE TABLE, ignorieren sie aber im
wirklichen Leben.

All das steht auch im Handbuch, das der OP sich ja konsequent weigert,
zu lesen. Weshalb ich ihn inzwischen auch nicht mehr lese.

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 06.02.2007 13:00:35 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 06.02.2007 13:40:14 von Zsolt Koppany

"Florian Laws" schrieb im Newsbeitrag
news:slrnesggke.jdq.fl-usenet-3@helena.bawue.de...
> Alle Zeilen selektieren, die in role_id einen ungültigen Wert haben,
> und diesen dann durch einen korrekten Wert ersetzen.
>

Für eine Tabelle kann ich das schon machen, nur wir haben cirka 90 Tabellen.

Zsolt

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 06.02.2007 13:46:30 von Florian Laws

On 2007-02-06, Zsolt Koppany wrote:
> "Florian Laws" schrieb im Newsbeitrag
> news:slrnesggke.jdq.fl-usenet-3@helena.bawue.de...
>> Alle Zeilen selektieren, die in role_id einen ungültigen Wert haben,
>> und diesen dann durch einen korrekten Wert ersetzen.
>>
>
> Für eine Tabelle kann ich das schon machen, nur wir haben cirka 90 Tabellen.

Kannst Du Dir kein Skript schreiben, das das für alle 90 Tabellen macht?
Tabellendefinitionen dumpen, alle Foreign-Key-Definitionen extrahieren,
jeweils passende Query generieren.

Was der jeweils "korrekte Wert" ist, musst Du aber wahrscheinlich selbst
festlegen, das wird Dir kein allgemeingültiges Skript abnehmen können.


Grüße,

Florian

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 07.02.2007 10:08:25 von Zsolt Koppany

> Kannst Du Dir kein Skript schreiben, das das für alle 90 Tabellen macht?
> Tabellendefinitionen dumpen, alle Foreign-Key-Definitionen extrahieren,
> jeweils passende Query generieren.
>
> Was der jeweils "korrekte Wert" ist, musst Du aber wahrscheinlich selbst
> festlegen, das wird Dir kein allgemeingültiges Skript abnehmen können.
>

Florian, ich würde soetwas von der Dantenbank erwarten.

Zsolt

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 07.02.2007 10:17:47 von Florian Laws

On 2007-02-07, Zsolt Koppany wrote:
>> Kannst Du Dir kein Skript schreiben, das das für alle 90 Tabellen macht?
>> Tabellendefinitionen dumpen, alle Foreign-Key-Definitionen extrahieren,
>> jeweils passende Query generieren.
>>
>> Was der jeweils "korrekte Wert" ist, musst Du aber wahrscheinlich selbst
>> festlegen, das wird Dir kein allgemeingültiges Skript abnehmen können.
>>
>
> Florian, ich würde soetwas von der Dantenbank erwarten.

Den korrekten Wert kann die Datenbank nicht generieren,
weil sie nicht wissen kann, was die Werte in der Datenbank
bedeuten.

Grüße,

Florian

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 07.02.2007 10:31:50 von Claus Reibenstein

Zsolt Koppany schrieb:

>> Was der jeweils "korrekte Wert" ist, musst Du aber wahrscheinlich selbst
>> festlegen, das wird Dir kein allgemeingültiges Skript abnehmen können.
>
> Florian, ich würde soetwas von der Dantenbank erwarten.

Und woher, bitte schön, soll die Datenbank wissen, welche Werte korrekt
sind und welche nicht, wenn niemand es ihr mitteilt?

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 07.02.2007 10:46:53 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 07.02.2007 10:48:57 von Zsolt Koppany

"Claus Reibenstein" <4spammersonly@web.de> schrieb im Newsbeitrag
news:52tkk8F1q4n4lU1@mid.individual.net...
> Zsolt Koppany schrieb:

> Und woher, bitte schön, soll die Datenbank wissen, welche Werte korrekt
> sind und welche nicht, wenn niemand es ihr mitteilt?

Die Antwort: FOREIGN KEY. Und dann weiss die Datenbank.

Zsolt

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 07.02.2007 10:52:10 von Florian Laws

On 2007-02-07, Zsolt Koppany wrote:
> "Claus Reibenstein" <4spammersonly@web.de> schrieb im Newsbeitrag
> news:52tkk8F1q4n4lU1@mid.individual.net...
>> Zsolt Koppany schrieb:
>
>> Und woher, bitte schön, soll die Datenbank wissen, welche Werte korrekt
>> sind und welche nicht, wenn niemand es ihr mitteilt?
>
> Die Antwort: FOREIGN KEY. Und dann weiss die Datenbank.

Und woher weiss sie, was mit den nicht korrekten Werten,
die aber leider (warum auch immer) in der Datenbank sind,
geschehen soll?

Grüße,

Florian

Re: Wie kann ich Tabellen mit falschen CONSTRAINT Werten reparieren?

am 07.02.2007 10:58:16 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de