Matthias: kleine SQL Frage

Hallo,

ich will zwischen zwei Tabellen Datensätze verschieben, soweit kein Problem.

INSERT INTO x SELECT * FROM y WHERE indexnr=1
zum Beispiel

Nur kann es vorkommen, das die Indexnummer eines zu kopierenden Objekts schon in der anderen Tabelle vorkommt und da es sich um einen Primärschlüssel handelt, darf der Eintrag nicht doppelt vorkommen. In solch einem Fall bricht MySQL den Vorgang ab.

Nun meine Frage:

Gibt es eine Möglichkeit alle Felder zu selektieren, bis auf den Primärschlüssel indexnr, ohne alle Felder einzeln anzugeben?
Wenn es 4 oder 5 Felder wären wäre es kein Thema, aber es sind 10mal so viele und die Feldnamen können sich in rythmischen Anbständen ändern...

Grüße, Matthias

  1. n'abend,

    ich will zwischen zwei Tabellen Datensätze verschieben, soweit kein Problem.

    verschieben? oder kopieren? willst du "verschieben" musst du in der ersten tabelle den datensatz nach dem kopieren halt noch löschen...

    INSERT INTO x SELECT * FROM y WHERE indexnr=1
    zum Beispiel

    Gibt es eine Möglichkeit alle Felder zu selektieren, bis auf den Primärschlüssel indexnr, ohne alle Felder einzeln anzugeben?

    INSERT INTO x SELECT column1, column2, colum3 FROM y WHERE indexnr=1
    müsste doch eigentlich auch tun? (ungetestet)

    ansonsten bleibt dir auch ein REPLACE INTO:
    REPLACE INTO x SELECT * FROM y WHERE indexnr=1
    ist der datensatz (durch primary key identifiziert) schon vorhanden, wird er mit den neuen werten überschrieben... ist der noch nicht vorhanden, wird er angelegt..

    im ersten fall passiert also ein DELETE + INSERT, im 2. fall ein INSERT

    weiterhin schönen abend...

    --
    wer braucht schon großbuchstaben?
  2. Hallo,

    für die DB kenne ich kleine Syntax, die Dir das gewünschte "Alle Spalten ohne Spalte XY" ermöglichen würde.

    Allerdings kannst Du Dir doch mittels API eine solche Funktion schreiben. Ermittele mittels eines "show columns from $tabelle" die Spaltennamen und schieß dann den Primary raus aus der Feldliste...

    Das was übrig bleibt, baust Du dann zu einem Query zusammen.

    Die Funktion könntest Du gerne hinterher hier posten, wenn Du sie fertig hast. Ich könnte sie auch gebrauchen ;-))

    LG
    Chris