Daten aus Tabellen übertragen

Mikana

Benutzer
Beiträge
17
Tach mal wieder.

Wer kann mir mitteilen, mit welchem Befehl ich bei Maria DB die Daten von Tabelle A zu Tabelle B übertragen kann? Also Kunden_ID 5 bucht Fahrten_ID 2 und 3.
Also aus zwei Tabellen die Werte übernehmen und diese dann in die neue einpflegen?
Wenn Fahrt A sich um 5 Min verzögert, dann sollte das in der Tabelle mit den übernommenen Daten ebenfalls angepasst sein. Automatisch am Besten.

Lg,
Mikana
 
Werbung:
Du musst ein Insert und ein Select zusammen setzen
Insert into Zieltabelle (<spaltennamen>)
Select (spaltennamen) from Ausgangstabelle
where ..

Automatisch anpassen geht per Trigger.
Aber das will man in der Form vielleicht nicht. Was Du schreibst, deutet auf eine gewisse Redundanz hin. Das vergeudet Platz und führt leicht zu widersprüchlichen Daten.
 
Nun habe ich mehrere Wege versucht, meine Tabelle mit Werten zu füllen.
Warum klappt das nicht? Wo liegt der Fehler?
FahrtenID und KundenID sind PK und FK. Gebuchter_Platz ist weder, noch.

Hier die Chronologie:

MariaDB [FUNKEL_REISEN]> INSERT INTO t_buchungen (KUNDENID) SELECT KUNDENID FROM t_kunde WHERE KUNDENID = 1;
ERROR 1364 (HY000): Field 'FAHRTENID' doesn't have a default value
MariaDB [FUNKEL_REISEN]> INSERT INTO t_buchungen (KUNDENID) SELECT KUNDENID FROM t_kunde WHERE KUNDENID = 1, 3, 4;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' 3, 4' at line 1
MariaDB [FUNKEL_REISEN]> INSERT INTO t_buchungen (KUNDENID) SELECT KUNDENID FROM t_kunde WHERE KUNDENID = 1, INSERT INTO t_buchungen (FAHRTENID) SELECT FAHRTENID FROM t_fahrt WHERE FAHRTENID = 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' INSERT INTO t_buchungen (FAHRTENID) SELECT FAHRTENID FROM t_fahrt WHERE FAHR...' at line 1
MariaDB [FUNKEL_REISEN]> INSERT INTO t_buchungen (KUNDENID, FAHRTENID) SELECT (KUNDENID) FROM t_kunde AND SELECT (FAHRTENID) FROM t_fahrt;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'AND SELECT (FAHRTENID) FROM t_fahrt' at line 1
MariaDB [FUNKEL_REISEN]> INSERT INTO t_buchungen (FAHRTENID) SELECT FAHRTENID FROM t_fahrt WHERE FAHRTENID = 1;
ERROR 1364 (HY000): Field 'KUNDENID' doesn't have a default value
MariaDB [FUNKEL_REISEN]> DESCRIBE t_buchungen
-> ;
+-----------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------+------+-----+---------+-------+
| KUNDENID | int(11) | NO | PRI | NULL | |
| GEBUCHTER_PLATZ | int(11) | YES | | NULL | |
| FAHRTENID | int(11) | NO | MUL | NULL | |
+-----------------+---------+------+-----+---------+-------+
3 rows in set (0.030 sec)

Lg,
Mikana
 
Mein Tipp: Fang doch vorne an. Wenn das erste Query schon nicht funktioniert,.....

Der Fehler wird ja direkt mitgemeldet: ERROR 1364 (HY000): Field 'FAHRTENID' doesn't have a default value

Das bedeutet das du die 'FAHRTENID' nicht setzt


MariaDB [FUNKEL_REISEN]> INSERT INTO t_buchungen (KUNDENID) SELECT KUNDENID FROM t_kunde WHERE KUNDENID = 1;
ERROR 1364 (HY000): Field 'FAHRTENID' doesn't have a default value
 
FahrtenID steht vermutlich auf NOT NULL (was auch Sinn macht), muss daher gleich beim Erzeugen des Eintrags mit gesetzt werden.

WHERE KUNDENID = 1, 3, 4 ist keine Gleichung, es gibt aber WHERE KINDENID IN ( 1,3,4 ) als Möglichkeit.

Du kannst einen INSERT nicht mit Komma abschließen, nur mit Semikolon. Also nicht WHERE KUNDENID = 1, INSERT sondern WHERE KUNDENID = 1; INSERT oder einfach WHERE KUNDENID = 1 INSERT

Bei
Code:
INSERT INTO t_buchungen (KUNDENID, FAHRTENID) SELECT (KUNDENID) FROM t_kunde AND SELECT (FAHRTENID) FROM t_fahrt;
willst du zwei Spalten eines Datensatzes befüllen (richtig), führst dann aber zwei getrennte SELECTs aus (die sich nicht mit AND koppeln lassen) um an die beiden Informationen zu kommen. Du müsstest KUNDENID und FAHRTENID in einem SELECT liefern, z.B. mit einem Join.
 
Du kannst Dir das so vorstellen:
Eine beliebige Tabelle, nennen wir sie "Insert Tabelle" gibt per
Select * from "Insert Tabelle"
ihren Inhalt aus. Damit sind nicht nur Daten ausgegeben, sondern auch eine Struktur: Reihenfolge und Spaltentypen.

Jedes von Dir geschriebene Select, das nun ein oder mehrere Datensätze produziert, die ein gleich strukturiertes Ergebnis liefern, kannst Du in einem Insert Statement für diese "Insert Tabelle" verwenden. Aus wieviel Ursprungstabellen dein eigenes Select besteht, ist dabei vollkommen egal, es muss nur analog zur Struktur der "Insert Tabelle" sein.

Um das Ganze etwas flexibler zu gestalten, kannst Du im Insert wie gewohnt, die Spalten benennen, die relevant sind. Entsprechend musst Du das Select Statement zur Befüllung adaptieren. Hat Deine Insert Tabelle 50 Spalten, Du willst aber nur 5 per Select befüllen, kannst Du auf diesem Weg alles beliebig anpassen. Nur die Struktur der selektierten Datensätze muss zur Struktur der Spalten der "Insert Tabelle" passen. (und natürlich der Inhalt/Bedeutung)

Also:
INSERT INTO t_buchungen (KUNDENID) SELECT KUNDENID FROM t_kunde WHERE KUNDENID = 1, INSERT INTO t_buchungen (FAHRTENID) SELECT FAHRTENID FROM t_fahrt WHERE FAHRTENID = 1;
wird zu
Code:
INSERT INTO t_buchungen
  (kundenid, fahrtenid)
  SELECT kundenid, fahrtenid
    FROM t_kunde k
    JOIN t_buchungen b
      ON k.kundenid = b.kundenid
   WHERE kundenid = 1
     AND fahrtenid = 1

Dieses Statement gibt im übrigen nicht so viel Sinn, da es fast identisch ist zu:
Code:
INSERT INTO t_buchungen
  (kundenid, fahrtenid)
VALUES (1,1)
Ich nehme an, dass es zu Testzwecken ist. Der einzige Unterschied: Das obere Statement könnte mehrere Datensätze liefern, die dann brav alle eingefügt werden, sofern dort definierte Table Constraints das nicht verhindern.

Natürlich ist das Statement sowieso nur anhand Deiner Fehlermeldung geraten. Aber so könnte es aussehen.
 
Werbung:
Um Dir mal zu zeigen, wie es gehen könnte ...

Code:
postgres=# create table kunden(kundenid int generated always as identity primary key, name text);
CREATE TABLE
postgres=# create table fahrten(fahrtenid int generated always as identity primary key, ziel text);
CREATE TABLE
postgres=# insert into kunden (name) values ('Meier');
INSERT 0 1
postgres=# insert into kunden (name) values ('Müller ');
INSERT 0 1
postgres=# insert into kunden (name) values ('Schubert');
INSERT 0 1
postgres=# insert into fahrten (ziel) values ('Berlin');
INSERT 0 1
postgres=# insert into fahrten (ziel) values ('Paris');
INSERT 0 1
postgres=# insert into fahrten (ziel) values ('Dresden');
INSERT 0 1
postgres=# create table buchungen(kundenid int references kunden, fahrtid int references fahrten);
CREATE TABLE

--
-- so, nun buchen Meier und Schubert eine Fahrt nach Dresden
--

postgres=# with k as (select kundenid from kunden where name in ('Meier','Schubert')), f as (select fahrtenid from fahrten where ziel = 'Dresden') insert into buchungen select k.kundenid, f.fahrtenid from k cross join f;
INSERT 0 2
postgres=# select * from buchungen ;
 kundenid | fahrtid 
----------+---------
        1 |       3
        3 |       3
(2 rows)

postgres=#

Bei der Gelegenheit mail ein schönes, aber seltenes Einsatzszenario für einen CROSS JOIN ;-)
 
Zurück
Oben