mysqldump - duplicate entry

mysqldump - duplicate entry

am 23.11.2006 17:26:08 von Thomas Barth

Hi,
ich fühle mich gerade von mysql auf den Arm genommen. Ich erhalte bei
der Kopie einer Datenbanktabelle die Meldung

mysqldump --opt database table -ppw | mysql --compress -u user -ppw
database_cp

ERROR 1062 at line 27: Duplicate entry '1' for key 1

Um dies zu umgehen, möchte ich den mysql mode bestimmen

set sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

und erhalte die Fehlermeldung

ERROR 1064: You have an error in your SQL syntax near 'sql_mode =
'NO_AUTO_VALUE_ON_ZERO'' at line 1

MySQL-Version ist 3.23.54 und sollte sql mode laut Doku kennen

http://dev.mysql.com/doc/refman/4.1/en/server-sql-mode.html

Kann mir gerade mal jemand auf die Sprünge helfen?

Thomas B

Re: mysqldump - duplicate entry

am 23.11.2006 17:37:07 von Daniel Fischer

Thomas Barth!

> ERROR 1064: You have an error in your SQL syntax near 'sql_mode =
> 'NO_AUTO_VALUE_ON_ZERO'' at line 1
>
> MySQL-Version ist 3.23.54 und sollte sql mode laut Doku kennen
>
> http://dev.mysql.com/doc/refman/4.1/en/server-sql-mode.html

Da steht, dass erst 4.1 SET sql_mode kennt.


Gruß
Daniel

Re: mysqldump - duplicate entry

am 23.11.2006 17:51:37 von Thomas Barth

Daniel Fischer wrote:
> Thomas Barth!
>
>> ERROR 1064: You have an error in your SQL syntax near 'sql_mode =
>> 'NO_AUTO_VALUE_ON_ZERO'' at line 1
>>
>> MySQL-Version ist 3.23.54 und sollte sql mode laut Doku kennen
>>
>> http://dev.mysql.com/doc/refman/4.1/en/server-sql-mode.html
>
> Da steht, dass erst 4.1 SET sql_mode kennt.
>
>

Also wäre /etc/init.d/mysql restart --sql-mode='NO_AUTO_VALUE_ON_ZERO'
zulässig?

Thomas B

Re: mysqldump - duplicate entry

am 23.11.2006 22:41:32 von Thomas Barth

Daniel Fischer wrote:
> Thomas Barth!
>
>> ERROR 1064: You have an error in your SQL syntax near 'sql_mode =
>> 'NO_AUTO_VALUE_ON_ZERO'' at line 1
>>
>> MySQL-Version ist 3.23.54 und sollte sql mode laut Doku kennen
>>
>> http://dev.mysql.com/doc/refman/4.1/en/server-sql-mode.html
>
> Da steht, dass erst 4.1 SET sql_mode kennt.
>
>

Wieso legt mysqldump der 3er Version überhaupt Sequenznummern für das
Autoinkrementfeld an, und beginnt dann auch noch mit 0, um dann beim
Einfügen über doppelte Einträge zu stolpern?
Soll ich nun etwa die Sequenzen etwa alle manuell durch NULL ersetzen?
Das würde ja bedeuten, dass ich dann doch erst den mysqldump in eine
Datei leiten muss, um die Ersetzungen vornehmen zu können. Diesen
Schritt möchte ich eigentlich durch das Pipen von mysqldump nach mysql
vermeiden.

Thomas B

Re: mysqldump - duplicate entry

am 24.11.2006 00:14:15 von Axel Schwenke

Thomas Barth wrote:
>
> Wieso legt mysqldump der 3er Version überhaupt Sequenznummern für das
> Autoinkrementfeld an, und beginnt dann auch noch mit 0, um dann beim
> Einfügen über doppelte Einträge zu stolpern?

Die Zeile mit der Null hat MySQL nicht angelegt. Das hast du selber -
bzw. eine Applikation - da rein geschrieben. Evtl. noch bevor das
AUTO_INCREMENT Attribut gesetzt wurde oder indirekt per UPDATE ...
SET id=id-1 WHERE ...

> Soll ich nun etwa die Sequenzen etwa alle manuell durch NULL ersetzen?

Nö. Es reicht, den einen Eintrag mit 0 zu ersetzen.

UPDATE

SET =NULL WHERE id=0

Damit bekommt die Zeile jetzt eine id != 0 und wenn du die Daten
noch einmal dumpst, dann kann der Dump auch von einem alten MySQL
eingelesen werden.


XL

Re: mysqldump - duplicate entry

am 24.11.2006 09:13:12 von Thomas Barth

Axel Schwenke wrote:
> Thomas Barth wrote:
>>
>> Wieso legt mysqldump der 3er Version überhaupt Sequenznummern für das
>> Autoinkrementfeld an, und beginnt dann auch noch mit 0, um dann beim
>> Einfügen über doppelte Einträge zu stolpern?
>
> Die Zeile mit der Null hat MySQL nicht angelegt. Das hast du selber -
> bzw. eine Applikation - da rein geschrieben. Evtl. noch bevor das
> AUTO_INCREMENT Attribut gesetzt wurde oder indirekt per UPDATE ...
> SET id=id-1 WHERE ...
>
>> Soll ich nun etwa die Sequenzen etwa alle manuell durch NULL ersetzen?
>
> Nö. Es reicht, den einen Eintrag mit 0 zu ersetzen.
>
> UPDATE

SET =NULL WHERE id=0
>

Geht leider nicht, da das Feld mit "unsigned NOT NULL auto_increment"
angelegt wurde.

Thomas B

Re: mysqldump - duplicate entry

am 24.11.2006 11:03:52 von Axel Schwenke

Thomas Barth wrote:
> Axel Schwenke wrote:
>> Thomas Barth wrote:
>>
>>> Soll ich nun etwa die Sequenzen etwa alle manuell durch NULL ersetzen?
>>
>> Nö. Es reicht, den einen Eintrag mit 0 zu ersetzen.
>>
>> UPDATE

SET =NULL WHERE id=0
>>
>
> Geht leider nicht, da das Feld mit "unsigned NOT NULL auto_increment"
> angelegt wurde.

- Recht hast du! Ich hatte gehofft, das explizite Setzen auf NULL
würde eine neue AUTO_INCREMENT id erzeugen. Also mußt du den Datensatz
per INSERT ... SELECT kopieren:

INSERT INTO
()
SELECT FROM
WHERE id=0

DELETE FROM
WHERE id=0


XL