Datensatz mit neuer ID x-mal duplizieren

Teckler

Benutzer
Beiträge
15
Hallo zusammen,
bin gerade am Befüllen einer neuen Tabelle
Und da man ja faul ist frage ich mich ob mir nicht ein SQL miniscript dabei helfen könnte

Ausgangslage:
"meinetabelle" hat am Tabellenende einen letzten Datensatz der 4x kopiert und am Tabellenende mit neuer ID angehängt werden soll

Beispiel letzter Datensatz
IDWert1Wert2Wert3Wert4Wert5Wert6
795loremipsum151000

Das Script sollte dann das hier schaffen, die ganzen Werte muss ich dann manuell friemlen (lassen sich nicht berechnen)
IDWert1Wert2Wert3Wert4Wert5Wert6
795loremipsum151000
796loremipsum151000
797loremipsum151000
798loremipsum151000
799loremipsum151000

Bin mit der MySQL Workbench zugange
Ein script Editor für normales SQL ist natürlich vorhanden

Danke schon mal vorab

Nachtrag:
ID einer Tabelle neu durchnummerieren ab ID1 hab ich schon hinbekommen
SET @a = 0;
UPDATE meinetabelle SET ID = (@a := @a +1);

Aber wie bekomme ich einen Datensatz x-mal kopiert ?
 
Zuletzt bearbeitet:
Werbung:
4 Datensätze generieren, das geht in mySQL wahrscheinlich nur so:
select * from (select '1' as egal
union all
select 'irgendwas'
union all
select 'sch.. egal'
union all
select 'endlich') x

dann:
insert into meinetabelle
select * from (select * from meinetabelle where id = <zureplizierendeID von meiner Tabelle>, <SelectMit4Datensätzen>)

Kann sein, dass es eleganter geht, bspw. wenn man irgendwo eine Tabelle mit ausreichend viel DS hat und davon 4 selektiert, statt des Unon Konstrukts oben. Oder es gibt in der "neuesten" Version von mySQL eine Möglichkeit, wirklich Datensätze zu generieren...
Keine Ahnung, ich benutze es nicht und bin nicht auf dem neuesten Stand da.

Achso und das "Select * .." ist schlampig. Man würde die Felder einzeln aufführen und gleich eine brauchbare ID nehmen. Aber das Prinzip ist richtig.
Und nebenbei zeigt es ein wichtiges Konzept von SQL, Mengenlehre sozusagen. Datenpermutation durch Crossjoin / Join ohne Join Kriterium...
Probier mal.
 
Du solltest für die Id Spalte unbedingt primary key Auto increment benutzen. Indizes selber erstellen ist ganz schlechter Stiel
 
also wie schon gesagt, die ID sollte autogeneriert und als PK definiert sein. Um mal schnell viele Datensätze (mit viel meine ich halt mal 1 Million oder so ...) nutze ich sehr gern generate_series() - was es aber evtl. nicht für MySQL gibt...

Code:
postgres=# create table demo (id int generated always as identity primary key, col1 int, col2 int, col3 int);
CREATE TABLE
postgres=# insert into demo (col1, col2, col3) select 10,20,30 from generate_series(1,10) x;
INSERT 0 10
postgres=# select * from demo;
 id | col1 | col2 | col3 
----+------+------+------
  1 |   10 |   20 |   30
  2 |   10 |   20 |   30
  3 |   10 |   20 |   30
  4 |   10 |   20 |   30
  5 |   10 |   20 |   30
  6 |   10 |   20 |   30
  7 |   10 |   20 |   30
  8 |   10 |   20 |   30
  9 |   10 |   20 |   30
 10 |   10 |   20 |   30
(10 rows)

postgres=#

Das ist also alles kein Hexenwert. Manchmal will man z.B. nicht alle 1 Million Rows gleich haben, auch das ist kein Ding:

Code:
postgres=# insert into demo (col1, col2, col3) select random() * 10,20,30 from generate_series(1,10) x;
INSERT 0 10
postgres=# select * from demo;
 id | col1 | col2 | col3 
----+------+------+------
  1 |   10 |   20 |   30
  2 |   10 |   20 |   30
  3 |   10 |   20 |   30
  4 |   10 |   20 |   30
  5 |   10 |   20 |   30
  6 |   10 |   20 |   30
  7 |   10 |   20 |   30
  8 |   10 |   20 |   30
  9 |   10 |   20 |   30
 10 |   10 |   20 |   30
 11 |    3 |   20 |   30
 12 |    2 |   20 |   30
 13 |    4 |   20 |   30
 14 |    2 |   20 |   30
 15 |    2 |   20 |   30
 16 |    5 |   20 |   30
 17 |    2 |   20 |   30
 18 |    0 |   20 |   30
 19 |    1 |   20 |   30
 20 |    5 |   20 |   30
(20 rows)

mal so als Fingerübung vorm Gute-Nacht-Bier ...
 
Danke für die Antworten.
Allerdings helfen die mir beim Grundproblem "Datensatz mit neuer ID x-mal duplizieren" nicht weiter
Ich will keine Werte in eine Abfrage einbauen
Ich will keine Random Werte erzeugen
ID Spalte muss editierbar sein, daß ist eine Stammdatentabelle und keine Bewegungsdatentabelle

Es soll nur der letzte Datensatz x-mal kopiert werden
Wie gesagt ich bin am Aufbau der Tabelle
Es wird ein Datensatz manuell mit individuellen Werten angelegt.
Und der muss dann x-mal kopiert werden und einige wenige Werte wiederum individuell angepasst werden

Habe in der Zwischenzeit weiter viel gegoockelt .. leider ohne Ergebnis
Es scheint daß Stammdaten immer eh da sind und niemals erst mal aufgebaut werden müssen, also findest sich auch keine Hilfe dafür

Schade
 
auch kein Problem.

Letzte Zeile:

Code:
postgres=# select * from demo where id = (select max(id) from demo);
 id | col1 | col2 | col3 
----+------+------+------
 20 |    5 |   20 |   30
(1 row)

4 neue Zeilen einfügen mit den Werten aus dieser:

Code:
postgres=# with last as (select * from demo where id = (select max(id) from demo)) insert into demo (col1, col2, col3) select col1, col2, col3 from last cross join (select * from generate_series(1,4)) x;
INSERT 0 4

Kontrolle:

Code:
postgres=# select * from demo;
 id | col1 | col2 | col3 
----+------+------+------
  1 |   10 |   20 |   30
  2 |   10 |   20 |   30
  3 |   10 |   20 |   30
  4 |   10 |   20 |   30
  5 |   10 |   20 |   30
  6 |   10 |   20 |   30
  7 |   10 |   20 |   30
  8 |   10 |   20 |   30
  9 |   10 |   20 |   30
 10 |   10 |   20 |   30
 11 |    3 |   20 |   30
 12 |    2 |   20 |   30
 13 |    4 |   20 |   30
 14 |    2 |   20 |   30
 15 |    2 |   20 |   30
 16 |    5 |   20 |   30
 17 |    2 |   20 |   30
 18 |    0 |   20 |   30
 19 |    1 |   20 |   30
 20 |    5 |   20 |   30
 21 |    5 |   20 |   30
 22 |    5 |   20 |   30
 23 |    5 |   20 |   30
 24 |    5 |   20 |   30
(24 rows)

postgres=#
 
@akretschmer Danke für die schnelle Antwort
Ich sehe postgres... ist das Script auf SQL lauffähig ?

Und ich will ja die komplette Zeile kopieren
Eine Zeile hat über 20 Spalten bei mir.. muss ich die alle aufführen in dem script oder geht das auch irgendwie mit: * ?
 
mußt halt sehen, wie Du das an MySQL anpassen kannst. Oder verwendest halt gleich PostgreSQL, wäre eh zukunfssicherer...
 
generate_series() gibt es nicht in der MariaDB die ich einsetze

Ja. Es gibt da sehr, sehr vieles nicht. generate_series(), was dynamisch eine Tabelle erstellt, könnte man durch eine statische Tabelle ersetzen. Viele andere Dinge, die MySQL & Co nicht können, sind schwer zu ersetzen. Dazu kommen die Bugs...
 
Danke... hilft aber dem Fragesteller nicht weiter wenn Du sagst daß SQL Sondermüll ist.. wie im letzten Thread
ich weiß nicht genau welcher Thread, aber MySQL liefert Dir z.B. bei syntaktisch falschen Abfragen statt eines Fehlers ein falsches Resultat. Dies ist seit 20 Jahren oder länger bekannt. Check-Constraints werden einfach ignoriert. Ich denke, die Bezeichnung, die ich da gewählt habe, ist noch untertrieben.
 
wenn Du sagst daß SQL Sondermüll ist.
"SQL" ist eine Abfragesprache, die von allen relationalen Datenbank verwendet werden. akretschmer hält halt nicht viel von MySQL.

MariaDB hat etwas ähnliches wie generate_series() - nachdem MariaDB und MySQL keine Funktionen kennen die Mengen zurück liefern können, gibt es wohl "virtuelle Tabellen" die ähnlich funktionieren:

Das folgende generiert 10000 Datensätze mit den Zahlen von 1 bis 10000
Code:
select *
from seq_1_to_10000

Die Zahlen im Tabellennamen musst Du entsprechend anpassen um die Anzahl der Datensätze zu erzeugen die Du möchtest. Ob es da irgendwo ein Limit gibt weiß ich nicht.

Ansonsten bleibt immer noch eine Lösung über Standard SQL mit einer rekursiven Abfrage:

Code:
with recursive numbers (nr) as (
  select 1 as nr
  union all
  select nr + 1
  from numbers 
  where nr + 1 <= 100
)
select *
from numbers
 
Werbung:
@castorp Danke
Ich will aber keine 10000 Datensätze mit gleichen Werten erzeugen.
Ich will eine bereits bestehende Zeile (mit allen Werten drin) mehrmals kopieren und mit neuer ID einfügen
Was genau sind "numbers" und "nr" in Deinem letzten Codeblock ?

Oder könntest es mir anhand meiner Tabellenstruktur oben in einem Code darstellen ?
 
Zurück
Oben