[SQL] Komplette Spalte ersetzen mithilfe einer Zuordnungstabelle

BurnerR

Bot #0384479
Registriert
20 Juli 2013
Beiträge
5.311
Ich habe hier einen table T, der hat u.a. eine Spalte 'internal_id' mit unique Einträgen "AAAA", "AAAB", "AAAC", ...
Desweiteren habe ich eine zuordnungstabelle mit den Spalten ['internal_id', 'new_id'] mit Einträgen ["AAAA", "XXXX"]. ["AAAB", "XXX1"], ["AAAC", "XXX2"]. Die Einträge in 'new_id' sind auch unique.
Wie kann ich (in mysql) alle Einträge in internal_id im table T durch die zugehörigen in new_id ersetzen?
Muss ich da mit den spaltennamen herumschrauben? Mich würde interessieren, wie das mit UPDATE und SELECT geht.
Gerne auch, wie das hypothetisch mit PostgreSQL ginge - rein aus Interesse.
 
Scheint nicht mehr als dies zu sein:

Update T set internal_id =(Select new_id from T2 Where internal_id=T.internal_id) ;


Ich habe gerade folgendes gemacht:
[src=mysql]
create table T(internal_id varchar(5));
insert into T(internal_id ) values('AAAAA');
insert into T(internal_id ) values('AAAAB');
insert into T(internal_id ) values('AAAAC');
insert into T(internal_id ) values('AAAAD');

create table T2(internal_id varchar(5),new_id varchar(5));
insert into T2 (internal_id,new_id) values('AAAAA', 'XXXX1');
insert into T2 (internal_id,new_id) values('AAAAB', 'XXXX2');
insert into T2 (internal_id,new_id) values('AAAAC', 'XXXX3');
insert into T2 (internal_id,new_id) values('AAAAD', 'XXXX4');

select * from T;
Update T set internal_id =(Select new_id from T2 Where internal_id=T.internal_id) ;
select * from T;

[/src]

Output:
AAAAA
AAAAB
AAAAC
AAAAD
XXXX1
XXXX2
XXXX3
XXXX4
 
  • Thread Starter Thread Starter
  • #3
Ah, ja vielen Dank für die Schützenhilfe!
Hab mir schon fast gedacht, dass es nicht so schwierig ist... es war sehr montagig gestern :o :beer:
 
Das funktioniert aber nur, wenn die neuen IDs nicht schon in den alten enthalten sind. In der folgenden Variation kann das Update nicht ausgeführt werden weil keys (temporär) doppelt wären.
[src=mysql]create table T(internal_id varchar(5) PRIMARY KEY);
insert into T(internal_id ) values('AAAAA');
insert into T(internal_id ) values('AAAAB');
insert into T(internal_id ) values('AAAAC');
insert into T(internal_id ) values('AAAAD');

create table T2(internal_id varchar(5),new_id varchar(5));
insert into T2 (internal_id,new_id) values('AAAAA', 'AAAAD');
insert into T2 (internal_id,new_id) values('AAAAB', 'AAAAC');
insert into T2 (internal_id,new_id) values('AAAAC', 'AAAAA');
insert into T2 (internal_id,new_id) values('AAAAD', 'AAAAB');

select * from T;
Update T set internal_id =(Select new_id from T2 Where internal_id=T.internal_id) ;
select * from T;[/src]
Wenn das eine Voraussetzung ist musst du vermutlich tatsächlich die Spalten modifizieren:
[src=mysql]create table T(internal_id varchar(5) PRIMARY KEY,
val INT);
insert into T(internal_id, val ) values('AAAAA', 1);
insert into T(internal_id, val ) values('AAAAB', 2);
insert into T(internal_id, val ) values('AAAAC', 3);
insert into T(internal_id, val ) values('AAAAD', 4);

create table T2(internal_id varchar(5),new_id varchar(5));
insert into T2 (internal_id,new_id) values('AAAAA', 'AAAAD');
insert into T2 (internal_id,new_id) values('AAAAB', 'AAAAC');
insert into T2 (internal_id,new_id) values('AAAAC', 'AAAAA');
insert into T2 (internal_id,new_id) values('AAAAD', 'AAAAB');

select * from T;
ALTER TABLE T ADD new_id varchar(5) AFTER internal_id;
UPDATE T JOIN T2 ON T.internal_id = T2.internal_id
SET T.new_id = T2.new_id;
ALTER TABLE T DROP internal_id;
ALTER TABLE T CHANGE new_id internal_id varchar(5) PRIMARY KEY;
select * from T;[/src]
(spalte val dient nur zur Veranschaulichung)

Oder noch einfacher: den primary key entfernen und hinterher wieder hinzufügen:
[src=mysql]ALTER TABLE T DROP PRIMARY KEY;
UPDATE T JOIN T2 ON T.internal_id = T2.internal_id
SET T.internal_id = T2.new_id;
ALTER TABLE T MODIFY internal_id varchar(5) PRIMARY KEY;[/src]
 
Zuletzt bearbeitet:
Zurück
Oben