replace-syntax

replace-syntax

am 03.11.2006 11:48:24 von echo

Hallo Leute,

zum aktualisieren einer Tabelle möchte ich replace...select verwenden.
Beide Tabellen sind ein paar hundert Zeilen lang, haben die selbe Struktur
und einen Index auf ein eindeutiges Feld.
Mit "replace into neu select * from alt" hängt er neu an alt hintenan
und jeder Versuch irgendwas mit where anzurichten wird mit einem Fehler
quittiert. Ich wäre also dankbar, wenn mir jemand verraten könnte wie
man's richtig macht.

MfG
hjs

Re: replace-syntax

am 03.11.2006 13:34:00 von GreenRover

Hans-Jürgen Schneider schrieb:
> Mit "replace into neu select * from alt" hängt er neu an alt hintenan

Ähmm wenn ich mir recht erinnere, musste man noch die felder an geben.

REPLACE INTO `neu` (`a`, `b`, `c` ,`d` ,`e`) SELECT `a`, `b`, `c` ,`d`
,`e` FROM `neu` WHERE `foo`="baa"

Re: replace-syntax

am 03.11.2006 14:24:11 von dev-null-use-reply-adress

Hans-Jürgen Schneider schrieb:
>
> zum aktualisieren einer Tabelle möchte ich replace...select verwenden.
> Beide Tabellen sind ein paar hundert Zeilen lang, haben die selbe Struktur
> und einen Index auf ein eindeutiges Feld.
> Mit "replace into neu select * from alt" hängt er neu an alt hintenan

| REPLACE works exactly like INSERT, except that if an old row in the table
| has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the
| old row is deleted before the new row is inserted."

Also: Haben die Daten aus "alt" die gleichen Werte in der eindeutig
indizierten Spalte, wie die in "neu"?

> Ich wäre also dankbar, wenn mir jemand verraten könnte wie
> man's richtig macht.

Vielleicht so?

TRUNCATE neu;
INSERT INTO neu SELECT ...


Gruß
JPM

Re: replace-syntax

am 03.11.2006 14:27:36 von Guido Schmidt

Hans-Jürgen Schneider schrieb:

> zum aktualisieren einer Tabelle möchte ich replace...select verwenden=
.
> Beide Tabellen sind ein paar hundert Zeilen lang, haben die selbe Struk=
tur=20
> und einen Index auf ein eindeutiges Feld.=20
> Mit "replace into neu select * from alt" hängt er neu an alt hintenan=
=20

Das eindeutige Feld muss als Unique oder Primary Key definiert werden.=20
Ansonsten kann MySQL nicht wissen, wie bestehende und zu ersetzende=20
Datensätze erkannt werden sollen.
http://dev.mysql.com/doc/refman/5.0/en/replace.html

Es ist immer eine gute Idee, die Feldnamen im SQL-Statement anzugeben.=20
Das Statement ist dann für Menschen lesbarer und im Falle einer=20
Erweiterung bzw. Änderung von Feldern einer der beiden Tabellen drohen =

sonst böse Überraschungen.

Guido

Re: replace-syntax

am 03.11.2006 15:13:36 von echo

Jens Peter Moeller schrieb:
>
> Hans-Jürgen Schneider schrieb:
> >
> > zum aktualisieren einer Tabelle möchte ich replace...select verwenden.
> > Beide Tabellen sind ein paar hundert Zeilen lang, haben die selbe Struktur
> > und einen Index auf ein eindeutiges Feld.
> > Mit "replace into neu select * from alt" hängt er neu an alt hintenan
>
> | REPLACE works exactly like INSERT, except that if an old row in the table
> | has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the
> | old row is deleted before the new row is inserted."
>
> Also: Haben die Daten aus "alt" die gleichen Werte in der eindeutig
> indizierten Spalte, wie die in "neu"?

Ja, haben sie. Aber die Anzahl Datensätze ist unterschiedlich.

> Vielleicht so?
>
> TRUNCATE neu;
> INSERT INTO neu SELECT ...

Beispielsweise erhält eine Filiale Kundendaten von der Zentrale, will
aber weiterhin Recherchen über ehemalige Kunden anstellen.
Die alte Tabelle enthält also Sätze, die es in der neuen nicht mehr
gibt. Die sollen auf jeden Fall bleiben. In der neuen Tabelle sind
sowohl welche die es in der alten noch nicht gibt, wie auch welche bei
denen einige Felder geänderte Inhalte haben können (die dann auch so
übernommen werden sollen). Wie im Beispiel, bliebe die Kundennummer
eindeutig.

MfG
hjs

Re: replace-syntax

am 03.11.2006 15:23:47 von echo

"Heiko (GreenRover) Henning" schrieb:
>
> Hans-Jürgen Schneider schrieb:
> > Mit "replace into neu select * from alt" hängt er neu an alt hintenan
>
> Ähmm wenn ich mir recht erinnere, musste man noch die felder an geben.
>
> REPLACE INTO `neu` (`a`, `b`, `c` ,`d` ,`e`) SELECT `a`, `b`, `c` ,`d`
> ,`e` FROM `neu` WHERE `foo`="baa"

Ist mir peinlich. Hab's durcheinandergebracht. Ich möchte eigentlich
von "neu" in Richtung "alt" replacen. Ist aber egal, denn das hat ja
mit der Syntax nichts zu tun.
Hatte gschrieben: "...where alt.nummer = neu.nummer", was er mir einem
"#1136 - Column count doesn't match value count at row 1" quittiert.

MfG
hjs

Re: replace-syntax

am 03.11.2006 15:40:35 von echo

Guido Schmidt schrieb:
>
> Hans-Jürgen Schneider schrieb:
>
> > zum aktualisieren einer Tabelle möchte ich replace...select verwenden.
> > Beide Tabellen sind ein paar hundert Zeilen lang, haben die selbe Struktur
> > und einen Index auf ein eindeutiges Feld.
> > Mit "replace into neu select * from alt" hängt er neu an alt hintenan
>
> Das eindeutige Feld muss als Unique oder Primary Key definiert werden.

Das trifft jedenfalls für die Zieldatei zu. Ergibt sich die Frage, ob
das für die Quelldatei auch nötig ist. Schließlich wird er sie sowieso
sequentiell abarbeiten und nur in der Zieldatei nach dem passenden Wert
suchen.

> Es ist immer eine gute Idee, die Feldnamen im SQL-Statement anzugeben.
> Das Statement ist dann für Menschen lesbarer und im Falle einer
> Erweiterung bzw. Änderung von Feldern einer der beiden Tabellen drohen
> sonst böse Überraschungen.

Meinst Du damit, die Felder alle aufzuzählen?
Das könnte ich zur Not mal machen. Aber gefallen würde es mir nicht.

MfG
hjs

Re: replace-syntax

am 06.11.2006 11:27:19 von echo

Nachtrag:

> Mit "replace into neu select * from alt" hängt er neu an alt hintenan

....jedenfalls dann, wenn gerade Freitag ist.
Heute hat er allerdings genau das gemacht, was ich erwartet habe.

Der einzige Unterschied sind diese schrägen Hochkommas mit denen der
Tabellenname eingeschlossen ist. Am Freitag hatte ich das Kommando
komplett hingeschrieben und heute das Angebot des Abfragefensters
editiert und selbige dabei drin gelassen.
Wo finde ich Erleuchtung über Sinn und Zweck dieser Zeichen?

MfG
hjs

Re: replace-syntax

am 06.11.2006 13:48:28 von Claus Reibenstein

Hans-Jürgen Schneider schrieb:

> Nachtrag:
>
>> Mit "replace into neu select * from alt" hängt er neu an alt hintenan
>
> ....jedenfalls dann, wenn gerade Freitag ist.
> Heute hat er allerdings genau das gemacht, was ich erwartet habe.
>
> Der einzige Unterschied sind diese schrägen Hochkommas mit denen der
> Tabellenname eingeschlossen ist. [...]
> Wo finde ich Erleuchtung über Sinn und Zweck dieser Zeichen?

Im Manual.

Diese Zeichen begrenzen - je nach Kontext - einen Datenbank-, Tabellen-
oder Spaltennamen. Sie sind nur dann erforderlich, wenn der Name mit
einem Schlüsselwort identisch ist oder bestimmte Sonderzeichen wie z.B.
Leerzeichen enthält.

Für `alt` und `neu` trifft beides nicht zu. Also sollte es auch ohne
gehen. Oder heißen Deine Tabellen anders? Wenn ja: wie?

Gruß. Claus

Re: replace-syntax

am 06.11.2006 15:36:10 von echo

Claus Reibenstein schrieb:
>
> Hans-Jürgen Schneider schrieb:
>
> > Nachtrag:
> >
> >> Mit "replace into neu select * from alt" hängt er neu an alt hintenan
> >
> > ....jedenfalls dann, wenn gerade Freitag ist.
> > Heute hat er allerdings genau das gemacht, was ich erwartet habe.
> >
> > Der einzige Unterschied sind diese schrägen Hochkommas mit denen der
> > Tabellenname eingeschlossen ist. [...]
> > Wo finde ich Erleuchtung über Sinn und Zweck dieser Zeichen?
>
> Im Manual.

Das Zeichen ist als Suchbegriff leider ungeeignet.
Hast Du mal ein Stichwort?

> Diese Zeichen begrenzen - je nach Kontext - einen Datenbank-, Tabellen-
> oder Spaltennamen. Sie sind nur dann erforderlich, wenn der Name mit
> einem Schlüsselwort identisch ist oder bestimmte Sonderzeichen wie z.B.
> Leerzeichen enthält.

Ich möchte nämlich schon gerne erfahren, wozu man denn normale Hochkommas
oder Gänsefüße benutzt, so dass man auf derartige Zeichen zurückgreifen
musste.

> Für `alt` und `neu` trifft beides nicht zu. Also sollte es auch ohne
> gehen. Oder heißen Deine Tabellen anders? Wenn ja: wie?

Daran kann es also nicht gelegen haben. Dann könnte es vielleicht der
automatische Umbruch gewesen sein, wodurch ich möglicherweise ein
Leerzeichen übersehen habe.

MfG
hjs

Re: replace-syntax

am 06.11.2006 16:26:15 von Claus Reibenstein

Hans-Jürgen Schneider schrieb:

> Claus Reibenstein schrieb:
>
>> Hans-Jürgen Schneider schrieb:
>>
>>> Der einzige Unterschied sind diese schrägen Hochkommas mit denen der
>>> Tabellenname eingeschlossen ist. [...]
>>> Wo finde ich Erleuchtung über Sinn und Zweck dieser Zeichen?
>>
>> Im Manual.
>
> Das Zeichen ist als Suchbegriff leider ungeeignet.
> Hast Du mal ein Stichwort?

Wenn Du im Inhaltsverzeichnis nach "name" suchst, solltest Du schnell
fündig werden. Bei meinem alten Referenzhandbuch (4.0, deutsch) lande
ich damit sofort bei "7.1.2. Datenbank-, Tabellen-, Index-, Spalten- und
Alias-Namen", und dort steht dann auch das Gesuchte.

> Ich möchte nämlich schon gerne erfahren, wozu man denn normale Hochkommas
> oder Gänsefüße benutzt, so dass man auf derartige Zeichen zurückgreifen
> musste.

Mit '' und "" werden Stringkonstanten definiert. "" kann man auch für
Namen benutzen, wenn man im ANSI-Modus fährt.

Gruß. Claus

Re: replace-syntax

am 06.11.2006 16:39:49 von Johannes Vogel

Hi Hans-Jürgen

Hans-Jürgen Schneider wrote:
> Claus Reibenstein schrieb:
>> Hans-Jürgen Schneider schrieb:
>>> Der einzige Unterschied sind diese schrägen Hochkommas mit denen der
>>> Tabellenname eingeschlossen ist. [...]
>>> Wo finde ich Erleuchtung über Sinn und Zweck dieser Zeichen?
>> Im Manual.
> Das Zeichen ist als Suchbegriff leider ungeeignet.
> Hast Du mal ein Stichwort?

| The identifier quote character is the backtick (‘`’):
Quelle: http://dev.mysql.com/doc/refman/5.1/en/legal-names.html

HTH, Johannes