winit3264
Goto Top

Datensätze in MySQL kopieren und beim Einfügen verändern

Hallo,

ich habe in meinem Joomla CMS eine MySQL Datenbank. Ich benutze HeidiSQL um darauf zuzugreifen. Die Tabelle ist z.B. so aufgebaut:

ID NAME ALIAS APPID
1 VW Golf vw_golf 3
2 Opel Astra op_astra 2
3 Renault Clio re_clio 1
4 Seat Ibiza se_ibiza 4

Datensätze: 441

Nun möchte ich folgendes erreichen:

Ich möchte nicht nur alle Datensätze mit der APPID 3 kopieren sondern beim Einfügen soll MySQL die APPID in 6 abändern und hinter jedem ALIAS _copy dranhängen.

Ist dies überhaupt möglich und wenn ja, wie?

Danke

Content-Key: 270983

Url: https://administrator.de/contentid/270983

Printed on: April 19, 2024 at 20:04 o'clock

Member: kaiand1
kaiand1 May 03, 2015 at 13:25:42 (UTC)
Goto Top
Moin
Ja es ist möglich face-smile
Dazu kannst du zb ein PHP Script machen das erstmal deine Aktuelle DB Ausliest und die Daten Aufbereitet und danach in die Neue DB Speichert.
Dazu ggfs noch vor dem Eintragen Prüfen ob der Eintrag schon drin ist um Doppelte EInträge zu verhindern.
Es währe auch möglich eine neue Spalte Names Copy zu erstellen und dort einfach eine 1 Einzutragen um dies zu erkennen.
Würde je nach Verwendung das Suchen/Beareiten mit dem _copy erleichtern zu Handhaben da in der Ausgabe dann per Script dies Besser Darstellen könntest...
Aber auch ein Dump zu machen und per Notepad zu Editieren oder per Bash... möglichkeiten gibts viele dazu...
Member: winIT3264
winIT3264 May 03, 2015 at 15:08:55 (UTC)
Goto Top
Die Datenbank selber ist immens groß, die fasse ich nicht an. Es handelt sich nur um eine Tabelle. Bitte konkrete Beispiele nennen wie z.B. SQL Abfrage.
Member: Biber
Biber May 03, 2015 updated at 19:56:34 (UTC)
Goto Top
Moin winIT3264,

ich bin nicht sicher. ob ich dein Problem verstehe - in der "immens grossen Datenbank" kann es doch in der gezeigten Tabelle nur eine Handvoll Datensätze mit der AppID 3 geben??

Egal, wenn die ID eine automatisch vergebene ID ist, dann:
INSERT INTO deineTabelle( NAME, ALIAS, APPID)
Select t.Name, t.Alias || '_copy' , 6 from deineTabelle t  
where AppID = 3;

[Edit]
Wenn das Feld "ID" kein automatisch generierter Wert ist und die Tabelle roundabout 450 Datensätze hat:
INSERT INTO deineTabelle( ID, NAME, ALIAS, APPID)
Select t.Id+450, t.Name, t.Alias || '_copy' , 6 from deineTabelle t  
where AppID = 3;
[/Edit]


Grüße
Biber
Member: kaiand1
kaiand1 May 03, 2015 at 18:41:08 (UTC)
Goto Top
Also 441 Datensätze würd ich jetzt nicht als immens groß Bezeichnen.
Hab da ne andere DB die hat >4 Millonen Einträge wo ich eher groß sagen würde...
Aber HeidiSQL kenn ich jetzt nicht kann daher nix zu deren Aufbau sagen.
Würde aber annehmen das es Ähnlich wie MySQL ist...
Aber ein Backup sollte vor Veränderungen immer gemacht werden sowie Regelmäßige durchgefürt werden...
Member: winIT3264
winIT3264 May 04, 2015 updated at 08:59:15 (UTC)
Goto Top
Hi Biber,

wenn ich das anwende setzt er mir in dem Feld ALIAS eine 0 und bricht dann nach einem kopierten Eintrag schon ab. Ansonsten scheint der Rest zu funktionieren.
Member: Biber
Biber May 04, 2015 at 09:05:51 (UTC)
Goto Top
Moin winIT3264,

tja, da muss ich was beichten...
Ich hab kein mySQL hier aufm Rechner und es von daher nicht getestet.

Bitte probier mal die Alternativ-Syntax:

INSERT INTO deineTabelle( NAME, ALIAS, APPID)
SELECT t.Name, CONCAT(t.Alias ,  '_copy') , 6 FROM deineTabelle t  
WHERE AppID = 3;

Grüße
Biber
Member: winIT3264
winIT3264 May 04, 2015 at 09:37:05 (UTC)
Goto Top
Hey, hey... jetzt geht's!

Funktioniert! Brilliant. Wie kann ich den Befehl so ergänzen dass er die restlichen Felder auch mit kopiert? Momentan setzt er in vielen Feldern NULL Werte. Wäre gut wenn er den Inhalt von den anderen Felder mitkopieren könnte (z.B. MODIDIED_BY, TYPE, CREATED)?
Member: Biber
Biber May 04, 2015 updated at 09:52:25 (UTC)
Goto Top
Moin winIT3264,

ähhm... wer von uns beiden kennt denn "die anderen Felder"?
Ich habe die 4 oder 5 Beispielfelder genommen, die du genannt hattest.
Weitere kannst du doch analog in die Feldliste in der ersten Zeile ("INSERT into deinetabelle (feldliste)") und in die Feldliste im "SELECT feldliste FROM.." in der zweiten Zeile einbauen.

Alternativ gib doch bitte die "echte" Struktur der Tabelle bekannt, dann können wir das hier zusammentippseln.

Grüße
Biber
Member: winIT3264
winIT3264 May 04, 2015 at 09:57:01 (UTC)
Goto Top
Die Felder sollten ja nur als Beispiel dienen, wenn man z.B. nur das Feld "modified_by" mit kopiert hätte haben wollen...

Das "analoge einbauen" habe ich ja auch versucht aber dann kommt eine Fehlermeldung.

Die Werte dieser Felder müssten noch mit reinkopiert werden:

Field 'type' doesn't have a default value
Field 'created' doesn't have a default value
Field 'modified' doesn't have a default value
Field 'modified_by' doesn't have a default value
Field 'publish_up' doesn't have a default value
Field 'publish_down' doesn't have a default value
Field 'priority' doesn't have a default value
Field 'hits' doesn't have a default value
Field 'state' doesn't have a default value
Field 'access' doesn't have a default value
Field 'created_by' doesn't have a default value
Field 'created_by_alias' doesn't have a default value
Field 'searchable' doesn't have a default value
Field 'elements' doesn't have a default value
Field 'params' doesn't have a default value
Member: Biber
Solution Biber May 04, 2015 updated at 10:17:41 (UTC)
Goto Top
Moin winIT3264,

na ja, wie geschrieben, einfach nach Schema F ergänzen:

INSERT INTO deineTabelle( NAME, ALIAS, APPID,
  type, created, modified, modified_by, publish_up, publish_down, priority,
  hits, state, access, created_by, created_by_alias, searchable, elements, params
)
SELECT t.Name, CONCAT(t.Alias ,  '_copy') , 6 ,  
  t.type, t.created, t.modified, t.modified_by, t.publish_up, t.publish_down, t.priority,
  t.hits, t.state, t.access, t.created_by, t.created_by_alias, t.searchable, t.elements, t.params
FROM deineTabelle t
WHERE AppID = 3;

P.S.
Im SELECT-Teil habe ich ja den Aliasnamen t verwendet, um Probleme wegen evtl reservierter Feldnamen wie ALIAS (oder jetzt dazugekommen TYPE, ACCESS, ..) zu vermeiden.
Kann sein, dass du reservierte Feldnamen in der oberen Feldliste in Anführungszeichen setzen musst - da weiss ich nicht, wie empfindlich mySQL ist.

Grüße
Biber
Member: winIT3264
winIT3264 May 04, 2015 at 10:17:26 (UTC)
Goto Top
An der Stelle wäre ich nicht drauf gekommen, ich habe die Felder vorne erweitert wo SELECT t.Name steht, habe dort die Felder hingepackt. Kein Wunder. Aber in der Form funktioniert es perfekt.

Vielen, vielen Dank. Würde man in jedem Forum einen "Biber" haben wäre das Internet ein viel besserer Ort für Hilfesuchende.