Referenzen

pedri

Neuer Benutzer
Beiträge
2
In der Vergangenheit habe ich meine Datenbanktabellen immer mit einem graphischen Tool wie SQLiteMaestro erstellt. Nun habe ich begonnen mein Datenbankdesign mittels SQL zu erstellen, was ich irgendwie einfacher und schneller finde. Nun stosse ich aber direkt auf ein Problem, was mir nicht klar ist:
Code:
DROP TABLE IF EXISTS components;
DROP TABLE IF EXISTS fragility_groups;
DROP TABLE IF EXISTS fragility_group_component;

CREATE TABLE components (
    component_id INTEGER  NOT NULL,
    component    TEXT(15) NOT NULL,
    description  TEXT(255),
    /* Primary Keys */
    CONSTRAINT pk_components
               PRIMARY KEY (component_id),
    /* UNIQUE */
    CONSTRAINT uq_component
               UNIQUE (component)              
);

CREATE TABLE fragility_groups (
    fragility_group_id INTEGER  NOT NULL,
    fragility_group    TEXT(50) NOT NULL,
    description        TEXT(255),
    CONSTRAINT pk_fragility_groups PRIMARY KEY (fragility_group_id),
    CONSTRAINT uq_fragility_group UNIQUE (fragility_group)                
);

CREATE TABLE fragility_group_component (
    component_id       INTEGER NOT NULL,
    fragility_group_id INTEGER NOT NULL,
    /* Primary Keys */
    CONSTRAINT pk_fragility_group_component
               PRIMARY KEY (component_id, fragility_group_id),
    /* Foreign Keys */
    CONSTRAINT fk_fragility_group_component_component_id
               FOREIGN KEY (component_id)
               REFERENCES components(component_id)
               ON UPDATE CASCADE
               ON DELETE RESTRICT,
    CONSTRAINT fk_fragility_group_component_fragility_group_id              
               FOREIGN KEY (fragility_group_id)
               REFERENCES fragility_groups(fragility_group_id)
               ON UPDATE CASCADE
               ON DELETE RESTRICT
);

INSERT INTO fragility_groups (fragility_group, description)
     VALUES ( 'TH001', 'blabla'),
            ('TH002', 'abcd');

INSERT INTO components (component, description)
     VALUES ('1TH10D001', 'Nachwärmeabfuhrpumpe 1TH10D001'),
            ('2TH20D001', 'Nachwärmeabfuhrpumpe 2TH20D001');

-- Das folgende sollte eine Fehlermeldung hervorrufen, da die beiden Werte nicht in den Tabellen vorhanden sind
INSERT INTO fragility_group_component (component_id, fragility_group_id) VALUES (100,99);

Interessanterweise wird in SQLiteMaestro der Eintrag in die Datenbank verweigert. In DBeaver sowie direkt mit sqlite3-Kommandozeile wird die Zeile in die Datenbank eingetragen, was m.E. nicht sein dürfte.
 
Werbung:
Also in Postgresql wirft das dritte Insert einen Fehler:

Code:
test=*# INSERT INTO fragility_group_component (component_id, fragility_group_id) VALUES (100,99);
FEHLER:  Einfügen oder Aktualisieren in Tabelle »fragility_group_component« verletzt Fremdschlüssel-Constraint »fk_fragility_group_component_component_id«
DETAIL:  Schlüssel (component_id)=(100) ist nicht in Tabelle »components« vorhanden.

Allerdings die beiden ersten auch, da jeweils die id-spalte im Insert fehlt - und diese aber NOT NULL ist.
 
Werbung:
Wie in meinem Beitrag geschrieben, lerne ich gerade mittels SQLite die Sprache SQL.

Ja, versteh.

Wenn SQLite die beiden ersten Inserts ohne Fehlermeldung akzeptiert, und auch in sqlite-Kommandozeile das dritte Insert ohne Fehler durchläuft, solltest Du Dich aber vielleicht fragen, ob sqlite zum Erlernen von SQL wirklich sinnvoll ist. Immerhin erkennst Du als 'lernender Mensch' mehr Fehler als das DB-System ...
 
Zurück
Oben