# SQL Datenbank Tabelle erstellen



## labelleamelie (10. Mai 2021)

Hallo, kann mir jemand sagen warum der Fehler auftritt, habe nach Lösungen gesucht aber nichts hat geholfen. 

CREATE TABLE Land(
    LandID                  INTEGER NOT NULL,
    LandName                VARCHAR2(30) NOT NULL,
    CONSTRAINT size_Land CHECK (LandName >= 2),
    CONSTRAINT Land_pk PRIMARY KEY(LandName)
);

CREATE TABLE Adresse(
    AdrID                   INTEGER NOT NULL,
    LandID                  INTEGER NOT NULL,
    PLZ                     INTEGER NOT NULL,
    HausNr                  INTEGER NOT NULL,
    Straße                  VARCHAR2(30) NOT NULL,
    Stadt                   VARCHAR2(30) NOT NULL, 
    CONSTRAINT Adresse_pk PRIMARY KEY (AdrID),
    CONSTRAINT Adresse_fk FOREIGN KEY (LandID) REFERENCES Land (LandID)
);

Fehlermeldung:

Fehler beim Start in Zeile: 8 in Befehl -
CREATE TABLE Adresse(
    AdrID                   INTEGER NOT NULL,
    LandID                  INTEGER NOT NULL,
    PLZ                     INTEGER NOT NULL,
    HausNr                  INTEGER NOT NULL,
    Straße                  VARCHAR2(30) NOT NULL,
    Stadt                   VARCHAR2(30) NOT NULL, 
    CONSTRAINT Adresse_pk PRIMARY KEY (AdrID),
    CONSTRAINT Adresse_fk FOREIGN KEY (LandID) REFERENCES Land (LandID)
)
Fehlerbericht -
ORA-02270: kein entsprechender Primär- o. eindeutiger Schlüssel für diese Spaltenliste
02270. 00000 -  "no matching unique or primary key for this column-list"
*Cause:    A REFERENCES clause in a CREATE/ALTER TABLE statement
           gives a column-list for which there is no matching unique or primary
           key constraint in the referenced table.
*Action:   Find the correct column names using the ALL_CONS_COLUMNS
           catalog view


----------



## kneitzel (10. Mai 2021)

In Land ist der Primary Key LandName, auf LandId ist kein Index. 

Wenn Adresse nun aber auf LandID referenzieren soll, dann muss da ein unique oder Primary key drauf sein. Also einfach noch ein unique index hinzu fügen.


----------



## LimDul (10. Mai 2021)

> CONSTRAINT Adresse_fk FOREIGN KEY (LandID) REFERENCES Land (LandID)


LandId soll auf die Tabelle Land, Spalte LandID gehen.

Leider ist der Primary Key bei der Tabelle Land aber nicht die LandID, sondern


> CONSTRAINT Land_pk PRIMARY KEY(LandName)


----------



## Gelöschtes Mitglied 65838 (10. Mai 2021)

du versuchst grad eine M : N also viel zu viele beziehung aufzubauen nur so wie du das gerade versuchst lässt es deine DB nicht zu
weil bei einem Foreign Key wie oben genannt ein unique oder primary key braucht

eine n : m beziehung braucht eine "zwischen Tabelle" mit der du sie umsetzen kannst


----------



## labelleamelie (11. Mai 2021)

Habe noch eine Fehlermeldung, die ich nicht beheben kann. Ich habe bereits folgendes probiert: Buchung_fk umbenannt, UNIQUE entfernt, CHECK umgeschrieben.

CREATE TABLE Buchung(
    BuchungsNR              INTEGER NOT NULL ,
    FWID                    INTEGER NOT NULL,
    Email                   VARCHAR2(30) NOT NULL UNIQUE,
    BuchDatum               DATE NOT NULL,
    StartDatum              DATE NOT NULL,
    EndDatum                DATE NOT NULL,
    RechnnungsNr            INTEGER NOT NULL UNIQUE,
    RechnungsDatum          DATE NOT NULL,
    Rechnungsbetrag         FLOAT NOT NULL,
    BewDatum                DATE NOT NULL,
    Ranking                 INTEGER NOT NULL,

    CONSTRAINT Buchung_pk PRIMARY KEY(BuchungsNR),
    CONSTRAINT Buchung_fk FOREIGN KEY (FWID) REFERENCES FerienWhng(FWID),
    CONSTRAINT Buchung_fk FOREIGN KEY (Email) REFERENCES Kunde(Email),
    CONSTRAINT size_Buchung CHECK (Ranking >= 1 AND Ranking <=5 ),
    CONSTRAINT size_Buchung CHECK (EndDatum >= (Startdatum +2))
);



Fehlerbericht -
ORA-02264: Name wurde bereits für einen vorhandenen CONSTRAINT verwendet
02264. 00000 -  "name already used by an existing constraint"
*Cause:    The specified constraint name has to be unique.
*Action:   Specify a unique constraint name for the constraint.


----------



## kneitzel (11. Mai 2021)

Joreyk hat gesagt.:


> du versuchst grad eine M : N also viel zu viele beziehung aufzubauen


Wo siehst du eine n:m Beziehung?



labelleamelie hat gesagt.:


> CONSTRAINT Buchung_fk FOREIGN KEY (FWID) REFERENCES FerienWhng(FWID),
> CONSTRAINT Buchung_fk FOREIGN KEY (Email) REFERENCES Kunde(Email),


Hier versuchst Du zwei foreign keys mit dem selben Namen zu erstellen.


labelleamelie hat gesagt.:


> CONSTRAINT size_Buchung CHECK (Ranking >= 1 AND Ranking <=5 ),
> CONSTRAINT size_Buchung CHECK (EndDatum >= (Startdatum +2))


Und hier noch einmal bei den checks ...

Generell wäre meine Empfehlung, da Namen zu verwenden, die etwas mehr aussagen:

```
CONSTRAINT Buchung_FWID_FerienWhng_FWID_fk FOREIGN KEY (FWID) REFERENCES FerienWhng(FWID),
CONSTRAINT Buchung_Email_Kunde_Email_fk FOREIGN KEY (Email) REFERENCES Kunde(Email),
```
Also sozusagen das Pattern: <Tabelle>_<Feld>_<Zieltabelle>_<Feld>_fk
Dann hast Du unterschiedliche Namen und kannst auch am Namen erkennen, was es für ein Index ist.

Und das zweite wäre ähnlich:

```
CONSTRAINT Buchung_Ranking_size_check CHECK (Ranking >= 1 AND Ranking <=5 ),
CONSTRAINT Buchung_EndDatum_StartDatum_check CHECK (EndDatum >= (Startdatum +2))
```
Hier ist die Regel etwas wie: <Tabelle>_<Felder>_<ggf. Beschreibung>_check

Das sind natürlich nur Anhaltspunkte und davon weiche ich auch teilweise ab. Aber eine Benennung in der Art macht aus meiner Sicht durchaus Sinn.

Edit: Natürlich sind dabei die maximalen Längen zu beachten. Du darfst nicht über 30 Bytes kommen (Oracle DB < 12.2) oder eben 128 Bytes (Oracle DB 12.2+). Bei der Version ist die Kompatibilitätseinstellung wichtig, nicht nur die installierte Datenbank-Software Version. https://docs.oracle.com/en/database...tml#GUID-75337742-67FD-4EC0-985F-741C93D918DA

Edit2: Und die Namen von Constraints müssen in der Datenbank unique sein, daher ist das Mindeste immer an einer definierten Stelle die Tabelle eindeutig einzufügen. Also wie ich z.B. immer am Anfang.


----------



## labelleamelie (11. Mai 2021)

kneitzel hat gesagt.:


> Wo siehst du eine n:m Beziehung?
> 
> 
> Hier versuchst Du zwei foreign keys mit dem selben Namen zu erstellen.
> ...


Vielen Dank!!


----------

