INSERT INTO abhängig von 2 anderen Tabellen

Hallo,

ich habe gerade ein Problem beim Erstellen einer INSERT INTO-Abfrage. Ich habe eine Tabelle “Produkte”:

id - name
1 reifen
2 bremsschlauch
3 segel
4 schleudersitz

Diese Produkte sollen über ihre ID einer Kategorie zugeordnet werden. Die Tabelle “Kategorien” existiert ebenfalls schon:

id - bezeichnung
1 - autobau
2 - schiffsbau
3 - flugzeugbau

Jetzt geht es ums Befüllen einer leeren Tabelle “Produktkategorien”, die diese Zuordnungen verwaltet:

id - kategorie_id - produkt_id
1 1 1
2 1 2
3 2 3
4 3 4

Nun wäre die Zeile 1,1,1 die Zuordnung “Reifen”->“Autobau” oder die 3,2,3 “Segel”->“Schiffsbau”.

Eine einfache INSERT INTO Produktkategorien VALUES(x,y,z) funktioniert nicht, da ich immer schauen muss, welches Produkt gemeint ist, um auf seine Kategorie zu schließen.

Welchen Ansatz würde man gehen, um dieses Problem zu lösen? (Was als Annahme gilt, ist folgendes: Zu jedem Produkt kenne ich die Bezeichnung der Kategorie!)

Danke im Voraus!

Hallo Rapthor,

Deine Fragestellung ist nicht so ganz verständlich. Kannst Du deine Definition der Tabellen mal mitteilen (CREATE TABLE …).



mfg

fristo

Natürlich! Das Interessante ist wahrscheinlich die letzte Tabelle. Produkt_Id und Kategorie_Id sind Fremdschlüssel.

CREATE TABLE produkte
(
id int4 NOT NULL,
name varchar(512),
CONSTRAINT produkte_pkey PRIMARY KEY (id)
)

CREATE TABLE kategorien
(
id int4 NOT NULL,
bezeichnung varchar(128),
CONSTRAINT kategorien_pkey PRIMARY KEY (id)
)

CREATE TABLE produktkategorien
(
id int4 NOT NULL,
kategorie_id int4,
produkt_id int4,
CONSTRAINT produktkategorien_pkey PRIMARY KEY (id),
CONSTRAINT ref12 FOREIGN KEY (produkt_id)
REFERENCES produkte (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ref13 FOREIGN KEY (kategorie_id)
REFERENCES kategorien (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)

Hallo Rapthor,

um es einfacher zu machen, habe ich Dir hier einigen Code zusammengestellt. Allerdings sind einige Namen geändert worden. Aber da wirst Du schon durchschauen. Mit PGAdmin kannst Du den Code auch testen.

-- DROP TABLE   produkt;
-- DROP TABLE   kategorie;
-- DROP TABLE   type;
-- DROP TABLE   markt;

-- ==================================================================

CREATE TABLE    type
                (
                id              SERIAL          PRIMARY KEY,
                bezeichnung     VARCHAR(30)     NOT NULL
                );

CREATE TABLE    markt
                (
                id              SERIAL          PRIMARY KEY,
                bezeichnung     VARCHAR(30)     NOT NULL
                );

CREATE TABLE    kategorie
                (
                id              SERIAL          PRIMARY KEY,
                id_type         INTEGER         REFERENCES type,
                id_markt        INTEGER         REFERENCES markt,
                bezeichnung     VARCHAR(30)     NOT NULL,

                UNIQUE          (id_type,id_markt)
                );


CREATE TABLE    produkt
                (
                nummer          VARCHAR(20)     PRIMARY KEY,
                bezeichnung     VARCHAR(100)    NOT NULL,
                id_kategorie    INTEGER         REFERENCES kategorie
                );


INSERT INTO     type    (bezeichnung)   VALUES ('reifen');
INSERT INTO     type    (bezeichnung)   VALUES ('bremsschlauch');
INSERT INTO     type    (bezeichnung)   VALUES ('segel');
INSERT INTO     type    (bezeichnung)   VALUES ('schleudersitz');


INSERT INTO     markt   (bezeichnung)   VALUES ('autobau');
INSERT INTO     markt   (bezeichnung)   VALUES ('schiffsbau');
INSERT INTO     markt   (bezeichnung)   VALUES ('flugzeugbau');


INSERT INTO     kategorie
                (
                id_type,
                id_markt,
                bezeichnung
                )
SELECT          type.id,
                markt.id,
                type.bezeichnung || ' - ' || markt.bezeichnung AS bezeichnung
FROM            type
CROSS JOIN      markt;


INSERT INTO     produkt         (nummer, bezeichnung, id_kategorie)     VALUES (1, 'Segel 2*3', 9);
INSERT INTO     produkt         (nummer, bezeichnung, id_kategorie)     VALUES (2, 'Sitz spezial', 10);
INSERT INTO     produkt         (nummer, bezeichnung, id_kategorie)     VALUES (3, 'Reifen', 2);

-- ==================================================================

SELECT          *
FROM            type;

-- ==================================================================

SELECT          *
FROM            markt;

-- ==================================================================


Select          *
From            Kategorie;

-- ==================================================================

SELECT          produkt.nummer          AS Produktnummer,
                produkt.bezeichnung     as Produktbezeichnung,
                kategorie.bezeichnung   as Kategorie
FROM            produkt
INNER JOIN      kategorie
ON              produkt.id_kategorie = kategorie.id;

Im Endeffekt wird die Erzeugung der Datensätze für die Tabelle “kategorie” etwas komplexer ausfallen. Überlege was Du machen musst, wenn es Änderungen in den Tabellen “type” und “markt” gibt. Die wird es mit Sicherheit geben.



mfg

fristo