SQL Zeile x-mal kopieren und mit neuer ID in gleicher Tabelle einfügen

Teckler

Lt. Commander
Registriert
Mai 2020
Beiträge
1.171
Hallo zusammen,

eigentlich ist es eine ganz einfache Fragestellung.
Trotz intensiver Suche finde ich aber nichts.... oder ist das mit SQL Scripts gar nicht zu lösen ?

Ausgangssituation:
Bin am Befüllen einer Stammdatentabelle
Ich lege dazu jeweils manuell einen neuen Datensatz am Ende der Tabelle an.
Dann kopiere ich die Zeile mehrmals manuell, korrigiere die ID und passe einige Werte (für die Varianten der urspünglichen Zeile) an

Dieses x-mal kopieren und mit neuer ID einfügen hätte ich gerne per Script gemacht damit ich dann nur noch paar Werte anpassen muss.

Geht das denn mit SQL Scripts ?
Können Schleifen programmiert werden die x-mal Datensätze kopieren ?
Oder gibts eine eingebaute Funktion dafür die ich schlicht übersehen habe ?

Danke schon mal vorab

Nachtrag:
Falls das ID Hochzählen zu kompliziert ist könnten die kopierten Datensätze auch erstmal in eine tmp Datei geschrieben werden.
In so einer tmp Datei kann ich dann die ID automatisch vergeben lassen und das Ergebnis in die richtige Tabelle zurück kopieren

Hier zur Info das Durchnummerieren:
SET @a = 123;
UPDATE meinetabelle.tmp SET ID = (@a := @a +1);

Meine Hoffnung war ja daß das Kopieren mit ähnlichem zwei- oder drei Zeiler geht

Und nein falls die Frage aufkommt, ich will keine Auto-ID, die Tabelle muss nachträglich erweiterbar sein und ich will die Daten strukturiert sortiert haben damit die Übersichtlichkeit gewahrt bleibt.
 
Zuletzt bearbeitet:
IDs sollte die Datenbank verwalten und nicht der User. Es gibt wenige sinnvolle Einsatzgebiete, wo IDs manuell gesetzt werden sollten. Dein Konzept ist mir daher schon negativ aufgefallen. Du müsstest daher auch nichts anpassen.

Den Rest macht SELECT INTO, plus Schleife, wenn es N-Mal der selbe sein muss

Erweiterbarkeit kommt nicht durch falschen Einsatz von IDs sondern u.a. durch Atomisierung, also gerade die Verwendung von ID und Referenzierung auf andere Tabellen
 
  • Gefällt mir
Reaktionen: Oelepoeto, Teckler, Raijin und eine weitere Person
tRITON schrieb:
Den Rest macht SELECT INTO, plus Schleife, wenn es N-Mal der selbe sein muss
Genau die Syntax suche ich ja
Kannst Du mir ein Beispiel geben bitte ?

Ich setze MariaDB ein.
 
Teckler schrieb:
Dieses x-mal kopieren und mit neuer ID einfügen hätte ich gerne per Script gemacht damit ich dann nur noch paar Werte anpassen muss.
Ein insert muss ja keine festen Werte haben, die können auch von einem select stammen. In deinem Fall würde das select die referenzzeile liefern. Welche ID du dabei insertest ist dir überlassen.
sql loop beispiele
 
  • Gefällt mir
Reaktionen: Teckler
tRITON schrieb:
Erweiterbarkeit kommt nicht durch falschen Einsatz von IDs sondern u.a. durch Atomisierung, also gerade die Verwendung von ID und Referenzierung auf andere Tabellen
Es gibt KEINE Referenzierung auf andere Tabellen, dann habe ich das im letzten Satz wohl nicht ausreichend genau beschrieben

Micke schrieb:
Ein insert muss ja keine festen Werte haben, die können auch von einem select stammen. In deinem Fall würde das select die referenzzeile liefern. Welche ID du dabei insertest ist dir überlassen.
Hättest Du mir ein Beispiel von: SELECT INTO, plus Schleife, wenn N-Mal der selbe Satz kopiert werden soll ?

Nachtrag: Ohh sorry !
Hab leider jetzt erst den Link gesehen.. muss mal anschauen
 
Zuletzt bearbeitet:
ungefähr so:
Code:
DECLARE @Counter INT

WHILE(@Counter IS NOT NULL AND @Counter < 10)
BEGIN
   INSERT INTO SampleTable ( Id, Spalte1)
   SELECT 'blub', Spalte1 FROM SampleTable WHERE Id = 'bla';
   SET @Counter  = @Counter  + 1
END
blub kannst du durch deine neuen ID's ersetzen.
bla ist die ID deiner ReferenzZeile
 
  • Gefällt mir
Reaktionen: Teckler
@Micke Danke ! .. aber ich bin leider überfordert.
Bin in der MySQL Workbench unterwegs

Wenn ich den Code in den Workbench Editor kopiere und anpasse sehe ich nur Fehler.

Ist das denn eine normales Script das durchläuft oder ist das irgendeine Funktion die anders behandelt werden muss ?

Ich komme auch mit ( Id, Spalte1) nicht klar.
Eine Zeile hat bei mir über 20 Spalten.
Gibts dafür evtl auch Platzhalter wie ?: *
 
Teckler schrieb:
Hier zur Info das Durchnummerieren:
SET @a = 123;
UPDATE meinetabelle.tmp SET ID = (@a := @a +1);
zu spät gesehen. Das kannste auch haben:

Code:
  INSERT INTO SampleTable ( Id, Spalte1)
   SELECT (select max(ID) +1 FROM SampleTable) , Spalte1 FROM SampleTable WHERE Id = 'bla';
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Teckler
@Micke Danke nochmal

Aber wie gesagt, bei der ersten Zeile DECLARE @counter INT bekomme ich schon Fehler

Teckler schrieb:
Ist das denn eine normales Script das durchläuft oder ist das irgendeine Funktion die anders behandelt werden muss ?
Teckler schrieb:
Ich komme auch mit ( Id, Spalte1) nicht klar.
Eine Zeile hat bei mir über 20 Spalten.
Gibts dafür evtl auch Platzhalter wie ?: *

Und das sind auch alles Rätsel für mich.
Komme heute eh nicht mehr weiter und muss mich verabschieden
 
Teckler schrieb:
@Micke
Ist das denn eine normales Script das durchläuft oder ist das irgendeine Funktion die anders behandelt werden muss ?
Ist ein Block, ja. Schau in deinem Tool/deiner DB mal nach Beispielen für die Syntax von Prozeduren/Funktionen.
Die Behandlung hängt davon ab wie du das ganze feuern willst - falls als stored procedure oder function, würde ich die jeweilige per GUI anlegen und den code hineinkopieren.
Wenn du das Kopieren nur ab und zu machst, kannst du die insert Zeile auch stattdessen einfach so oft ausführen wie nötig. Der Wunsch einer Schleife kam ja von dir :)

Teckler schrieb:
@Micke
Ich komme auch mit ( Id, Spalte1) nicht klar.
Eine Zeile hat bei mir über 20 Spalten.
Gibts dafür evtl auch Platzhalter wie ?: *
Id und Spalte1 sind willkürliche Beispielnamen für Spalten. Die müssen durch deine 20 ersetzt werden.
* als Platzhalter geht hier leider nicht, weil du nicht alle Spalten haben willst.

Aber mal kurz rausgezoomt - du musst Datensätze in der DB nicht mehr via SQL pflegen. Moderne Sprachen haben dafür Abstraktionen, sodaß du in deiner WunschSprache bleiben kannst und kein Wort SQL kennen musst.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Teckler
@Micke Danke für Deine Geduld
stored Procedere, function, Sprachen und Abstraktionen sagen mir leider nichts.
Du bist im SQL Wissen ganz oben.
Ich ganz unten.
Habe die Frage hier gemacht in der Hoffnung eine Lösung zu bekommen.
Ich hab nur die MySQL Workbench zur Verfügung in der ich SQL Befehle geben kann.
 
dann #8 einfach so oft ausführen wie gebraucht :)
Oder einfach wie erwähnt in deiner primären Sprache bleiben.
 
  • Gefällt mir
Reaktionen: Teckler
Teckler schrieb:
stored Procedere, function, Sprachen und Abstraktionen sagen mir leider nichts.
Du bist im SQL Wissen ganz oben.
Ich will dir nicht zu nahe treten, daran solltest du vielleicht arbeiten. Dann tritt so etwas nicht mehr auf:
Teckler schrieb:
ich will keine Auto-ID, die Tabelle muss nachträglich erweiterbar sein und ich will die Daten strukturiert sortiert haben damit die Übersichtlichkeit gewahrt bleibt.
weil genau dafür gibt es Views. Schlüssel gehören wie schon mehrfach angesprochen in die Hand des DBMS. Und selbst da bist du relativ flexibel, wie diese erstellt werden. Kannst auch mehrere definieren, wenn benötigt. Order ist bekannt? Damit kannst du das sortieren wie auch immer du magst.

Nur mal so was ich gelesen habe und wie ich es lösen würde, Prozedur nimmt einen Schlüssel entgegen. Der Datensatz mit diesem Schlüssel wird gelesen und x mal angelegt und ein anderes Schlüsselfeld geändert. Du würdest dann jedes Mal diese Prozedur mit dem Schlüssel als Parameter aufrufen.
Wobei ich mir an dieser Stelle Sorgen um die Normalform machen würde, mit hoher Wahrscheinlichkeit würden dann wohl Daten doppelt in der DB liegen. Das sollte nie (auf jeden Fall bei Datenbanken die nicht eben ein paar 100k+ requests die Sekunde verarbeiten müssen, oder Auswertungen fahren die über zig hundert Tabellen gehen) das Ziel sein.
 
  • Gefällt mir
Reaktionen: Oelepoeto
@Micke Danke nochmal.. Du hast mich auf die Lösung gebracht !
Konnte die #8 noch so anpassen daß automatisch die höchste ID gesucht und dieser Satz (wie von Dir beschrieben) auf die nächste ID+1 kopiert wird.

Das Beste daran ist daß ich nun die höchste ID gleich mit weiterem Befehl korrigieren und in einem Script in der Workbench in einem Durchlauf alle neu angelegten Zeilen (den code x-mal kopieren und anpassen) korrigieren kann.
Somit ist nicht nur die Hauptaufgabe (x-mal kopieren) erfüllt sondern auch die Korrektur der neu hinzugefügten Zeilen

Da es in fast allen Foren mit "hat geklappt" endet aber fast nie die Lösung zu sehen ist mache ich hier die Ausnahme

Code:
INSERT INTO meinetabelle (id,feld1,feld2,feld3,feld4)
SELECT (select max(id)+1 FROM meinetabelle),feld1,feld2,feld3,feld4
FROM meinetabelle
WHERE Id in (select max(id) meinetabelle;

update meinetabelle
set        feld2='loremipsum',feld3=4711
where id in (select max(id) meinetabelle);

..
 
Zuletzt bearbeitet:
Zurück
Oben