SQL: Wie kann man einen Datensatz duplizieren?
Adrian Kousz
- datenbank
0 dedlfix
1 Vinzenz Mai0 Ilja0 Adrian Kousz0 dedlfix
Liebe Community!
Ich habe eine Frage, deren Antwort ich auf dem Internet leider nicht gefunden habe... (Ich habe bei Google nach: ""duplicate record" sql" gesucht, was aber v.a. Duplikate löschen beantwortete. Ebenfalls nach ""create duplicate record" sql", brachte aber nicht das gewünschte Resultat).
Irgendwie sollte es ja so gehen:
INSERT INTO table SELECT * FROM table WHERE p_id = x
Das Problem ist aber der Primary Key p_id. Der kommt dann natürlich doppelt vor.
Weiss jemand, wie das Problem zu lösen ist?
Gruss,
Adrian
PS: Arbeite mit MySQL
echo $begrüßung;
INSERT INTO table SELECT * FROM table WHERE p_id = x
Das Problem ist aber der Primary Key p_id. Der kommt dann natürlich doppelt vor.
Wieso "natürlich"? Diese Gegenfrage sei gestattet, da ich deine Daten nicht kenne. Und da ich auch nicht weiß, ob der Primärschlüssel erhalten bleiben soll oder einen anderen, neuen Wert annehmen darf, weil es dir nur um die restlichen Daten geht, nehme ich einfach mal letzteres an.
Wenn die Zieltabelle ein auto_increment-Feld als Primärschlüssel hat, selektiere nur die Nicht-PK-Felder der Quelltabelle. Ansonsten schau dir bitte die INSERT ... SELECT Syntax an, da sind Möglichkeiten aufgeführt, den Umgang mit doppelten Schlüsseln zu spezifizieren.
echo "$verabschiedung $name";
Ich habe mir die INSERT ... SELECT Syntax angesehen. Dort stehen v.a. zwei interessante Sachen:
AUTO_INCREMENT columns work as usual.
Tut es aber anscheinend nicht...
Specify IGNORE to ignore rows that
would cause duplicate-key violations.
Habe ich folgendermassen probiert:
INSERT IGNORE p_id INTO g_pages SELECT * FROM g_pages WHERE p_id = x
echo $begrüßung;
Ich habe mir die INSERT ... SELECT Syntax angesehen. Dort stehen v.a. zwei interessante Sachen:
AUTO_INCREMENT columns work as usual.
Tut es aber anscheinend nicht...
Wenn du nicht sagst und zeigst, was du wie versucht hast, kann ich dir auch nicht sagen, was du daran ändern musst, dass es tut.
Specify IGNORE to ignore rows that
would cause duplicate-key violations.
Habe ich folgendermassen probiert:
INSERT IGNORE p_id INTO g_pages SELECT * FROM g_pages WHERE p_id = x
Und was war das Ergebnis? Was war überhaupt das genaue Ziel?
echo "$verabschiedung $name";
Und was war das Ergebnis? Was war überhaupt das genaue Ziel?
INSERT IGNORE p_id INTO ... gibt einen Syntax-Fehler, den ich auch gefunden habe, es heisst: INSERT IGNORE INTO ... das bringt aber nicht das gewünschte Resultat.
--------
Ich möchte lediglich einen Datensatz duplizieren (Der Sinn spielt dabei keine Rolle). p_id soll natürlich automatisch gesetzt werden (da es PK und AI ist) und ich möchte die Kolonnennamen nicht hinschreiben (da das Statement bei Änderungen der Tabelle evtl. umgeschrieben werden müsste).
--------
Das bisher beste Resultat gab folgendes:
INSERT INTO g_pages SELECT * FROM g_pages WHERE p_id=1 ON DUPLICATE KEY UPDATE p_id=last_insert_id() + 1
Das gibt aber keinen neuen Datensatz, sondern erhöht die ID des alten um 1.
habe d'ehre Adrian
Ich möchte lediglich einen Datensatz duplizieren (Der Sinn spielt dabei keine Rolle). p_id soll natürlich automatisch gesetzt werden (da es PK und AI ist) und ich möchte die Kolonnennamen nicht hinschreiben (da das Statement bei Änderungen der Tabelle evtl. umgeschrieben werden müsste).
Ich wuerde ueber einen Umweg wie folgt vorgehen:
Mit SELECT den Originaldatensatz holen und in ein Array speichern.
Mit mysql-fetch-field die Feldinformationen holen und in ein Array speichern. Du bekommst Feldname und Feldtyp (1 = numeric)
Mit foreach Deinen SQL-String bauen, z.B.
$SQL = "";
foreach($field_name as $key => $value) {
if($key == 0) $trenner = "";
else $trenner = ", ";
if($field_type[$key] == "A") $SQL .= $trenner.$field_name[$key]."='".$field_value[$key]."'";
else if($field_type[$key] == "N") $SQL .= $trenner.$field_name[$key]."=".$field_value[$key];
}
$SQLi = "INSERT INTO wtu_adr_base SET unique_key = 0, ".$SQL;
$SQL_RESULT = mysql_query($SQL, $DB);
blubb blubb fuer Errorhandling etc.
man liest sich
Wilhelm
Kleiner Fehler beim Kopieren und Aendern
$SQL_RESULT = mysql_query($SQLi, $DB);
Hallo Adrian,
Ich habe eine Frage, deren Antwort ich auf dem Internet leider nicht gefunden habe... (Ich habe bei Google nach: ""duplicate record" sql" gesucht, was aber v.a. Duplikate löschen beantwortete. Ebenfalls nach ""create duplicate record" sql", brachte aber nicht das gewünschte Resultat).
was nicht verwunderlich ist. Es ist eine gute Idee, Redundanzen zu vermeiden.
Was hast Du genau vor?
Warum benötigst Du soetwas?
Was möchtest Du mit dem doppelten Datensatz erreichen?
Irgendwie sollte es ja so gehen:
INSERT INTO table SELECT * FROM table WHERE p_id = x
Das Problem ist aber der Primary Key p_id. Der kommt dann natürlich doppelt vor.
Weiss jemand, wie das Problem zu lösen ist?
Wenn es in der Tabelle einen Primärschlüssel gibt, dann ist dies ein unlösbares Problem :-) Und das ist gut so.
Gibt es in Deiner Tabelle _keinen_ eindeutigen Index, dann könntest Du zwar tun, was Du willst, einen Sinn darin kann ich jedoch nicht erkennen.
Daher nochmals die Frage:
Was ist Dein wirkliches Ziel?
Was ist das reale Problem, warum Du einen Datensatz "doppelt" haben möchtest?
PS: Arbeite mit MySQL
Grundsätzlich ist es bei MySQL sinnvoll, die genaue Version anzugeben, da sich die Fähigkeiten von Version zu Version dramatisch unterscheiden können. Das ändert allerdings nichts an Deinem Problem.
Freundliche Grüße
Vinzenz
habe d'ehre Vinzenz
Warum benötigst Du soetwas?
Was möchtest Du mit dem doppelten Datensatz erreichen?
Datensatze einfach automatisiert kopieren und mit einem neuen Schluessel anlegen? Wo siehst *DU* ein Problem damit?
man liest sich
Wilhelm
Hallo Wilhelm,
Warum benötigst Du soetwas?
Was möchtest Du mit dem doppelten Datensatz erreichen?Datensatze einfach automatisiert kopieren und mit einem neuen Schluessel anlegen? Wo siehst *DU* ein Problem damit?
ich habe überhaupt kein Problem damit, welches Problem hast Du mit meiner Antwort?
Grüße
Vinzenz
habe d'ehre Vinzenz
Warum benötigst Du soetwas?
Was möchtest Du mit dem doppelten Datensatz erreichen?
ich habe überhaupt kein Problem damit, welches Problem hast Du mit meiner Antwort?
Findest Du obige Fragen wirklich sinnvoll?
man liest sich
Wilhelm
Hallo Wilhelm,
Warum benötigst Du soetwas?
Was möchtest Du mit dem doppelten Datensatz erreichen?ich habe überhaupt kein Problem damit, welches Problem hast Du mit meiner Antwort?
Findest Du obige Fragen wirklich sinnvoll?
Ja, sonst hätte ich diese Fragen nicht gestellt. In vielen Fällen konnte ich einen besseren Vorschlag machen, in vielen Fällen lag das Problem ganz wo anders.
Bei Datenbankfragen ist oftmals nicht die Frage entscheidend, wie man etwas macht, sondern warum man etwas macht. Ähnliches gilt für meine Frage nach der MySQL-Version. MySQL 5.0 bietet Stored Procedures und es könnte möglich sein, dass der OP mit einer solchen sein Problem lösen kann. SHOW könnte ihm dabei helfen.
Meine erste Antwort bot übrigens einen weiteren wichtigen Hinweis, den ich noch in keinem anderen Posting gesehen habe: nicht nur der Primärschlüssel bereitet Probleme. Nein, wenn der OP das gerne so flexibel hätte, https://forum.selfhtml.org/?t=139191&m=904045, so muss er _jeden_ eindeutigen Index mit berücksichtigen. Und damit komme ich wieder zurück zu meiner Frage:
Wozu benötigt der OP das?
Ich habe schon einige Erfahrung im Umgang mit relationalen Datenbanken und hatte eine Datensatzduplizierung noch nie nötig und auch noch nie in Erwägung gezogen. Deswegen interessiert mich das.
Freundliche Grüße
Vinzenz
yo,
Das Problem ist aber der Primary Key p_id. Der kommt dann natürlich doppelt vor.
Weiss jemand, wie das Problem zu lösen ist?
INSERT INTO table (hier_alle_spalten_ohne_p_id_durch_Komma_getrennt)
SELECT hier_alle_spalten_ohne_p_id_durch_Komma_getrennt FROM table WHERE p_id = x
vorraussetung, du benutz einen auto-increment-wet für den primary-key.
Ilja
INSERT INTO table (hier_alle_spalten_ohne_p_id_durch_Komma_getrennt)
SELECT hier_alle_spalten_ohne_p_id_durch_Komma_getrennt FROM table WHERE p_id = x
Klar, das wäre schon möglich, müsste aber bei einer Änderung der Spalten namen od. neuen Spalten angepasst werden. Das möchte ich nicht. Mir schwebt eher eine lösung vor, die so aussieht (falls es die gibt):
SELECT * ausser p_id ...
vorraussetung, du benutz einen auto-increment-wet für den primary-key.
Richtig, p_id ist PK & AI.
echo $begrüßung;
Klar, das wäre schon möglich, müsste aber bei einer Änderung der Spalten namen od. neuen Spalten angepasst werden. Das möchte ich nicht. Mir schwebt eher eine lösung vor, die so aussieht (falls es die gibt):
SELECT * ausser p_id ...
Das klappt nur, wenn du vorher
SET faulpelzmode=1
und gegebenfalls noch
SET tu_was_ich_meine=1
ausführst. :-)
echo "$verabschiedung $name";