# SQL Tabelle



## labelleamelie (13. Mai 2021)

Wie muss ich CONSTRAINT size_Buchung_EndDatum_StartDatum CHECK (EndDatum >= (Startdatum +2)) ändern? ( EndDatum min. 3 Tage)


CREATE TABLE Buchung(
    BuchungsNR              INTEGER NOT NULL,
    FWID                    INTEGER NOT NULL,
    Email                   VARCHAR2(30) NOT NULL CHECK(REGEXP_LIKE (Email, '^[A-Za-z0-9+_.-]+@(.+)$')),
    BuchDatum               DATE NOT NULL,
    StartDatum              DATE NOT NULL,
    EndDatum                DATE NOT NULL,
    RechnnungsNr            CHAR(12) NOT NULL CHECK(REGEXP_LIKE (RechnungsNr, '^[0-9]{12}$')),
    RechnungsDatum          DATE NOT NULL,
    Rechnungsbetrag         NUMBER(8, 2) NOT NULL,
    BewDatum                DATE NOT NULL,
    Ranking                 INTEGER NOT NULL,

    CONSTRAINT Buchung_BuchungsNR_pk PRIMARY KEY(BuchungsNR),
    CONSTRAINT Buchung_FWID_fk FOREIGN KEY (FWID) REFERENCES FerienWhng(FWID),
    CONSTRAINT Buchung_Email_fk FOREIGN KEY (Email) REFERENCES Kunde(Email),
    CONSTRAINT size_Buchung_Ranking CHECK (Ranking >= 1 AND Ranking <=5),
    CONSTRAINT size_Buchung_EndDatum_StartDatum CHECK (EndDatum >= (Startdatum +2))
);

)
Fehlerbericht -
ORA-02438: Spalten-Check kann sich nicht auf eine andere Spalte beziehen
02438. 00000 -  "Column check constraint cannot reference other columns"
*Cause:    attempted to define a column check constraint that references
           another column.
*Action:   define it as a table check constriant.


----------



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

du solltest in einer SQL datenbank nicht von einem anderen wert auf einen anderen Schließen wenn du das könntest wäre 1e Spalte komplett nutzlos

hast du anfangsdatum + dauer
kannst du auf das Enddatum kommen



hättest du jetzt auch noch das endatum in der Tabelle hättest du alles Doppelt drin 


PS: sogar mit so einem Buchungs Beispiel hats mir mein prof damals gezeight


----------



## labelleamelie (13. Mai 2021)

CONSTRAINT size_Buchung_EndDatum_StartDatum CHECK  (Startdatum +2) 
meinst du es so?


----------



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

1NF, 2NF, 3NF and BCNF in Database Normalization | Studytonight

du verstößt gegen die regeln meinte ich...


----------



## thecain (13. Mai 2021)

Ich sehe keinen Verstoss. Die Dauer ist ja gar nicht in der Tabelle...
Versuch mal den Constraint in einem separaten ALTER Table  auszuführen


----------



## labelleamelie (13. Mai 2021)

habe versucht ohne CONSTRAINT size_Buchung_EndDatum_StartDatum CHECK (EndDatum >= (Startdatum +2)) die Tabelle zu erstellen, selbe Fehler


----------



## thecain (13. Mai 2021)

Du hast bei der Erstellung der Tabelle RechnungsNr mit zwei n geschrieben, das ist der Fehler. Deswegen meiner der RegexCheck es ist eine andere Spalte, daher auch der Fehler


----------



## mihe7 (13. Mai 2021)

Die Fehlermeldung bezieht sich eindeutig auf einen Spaltencheck. Es dürfte der gemeint sein


labelleamelie hat gesagt.:


> RechnnungsNr CHAR(12) NOT NULL CHECK(REGEXP_LIKE (RechnungsNr, '^[0-9]{12}$')),


da RechnungsNr unterschiedlich geschrieben ist.


----------



## labelleamelie (13. Mai 2021)

thecain hat gesagt.:


> Du hast bei der Erstellung der Tabelle RechnungsNr mit zwei n geschrieben, das ist der Fehler. Deswegen meiner der RegexCheck es ist eine andere Spalte, daher auch der Fehler


Oh Gott, danke


----------



## labelleamelie (13. Mai 2021)

Noch eine Frage: Bezieht sich der Fehler  bei Anzahlung auf RechnunsNr CHECK REGEXP_LIKE in der Tabelle Buchung?


CREATE TABLE Buchung(
    BuchungsNR              INTEGER NOT NULL,
    FWID                    INTEGER NOT NULL,
    Email                   VARCHAR2(30) NOT NULL CHECK(REGEXP_LIKE (Email, '^[A-Za-z0-9+_.-]+@(.+)$')),
    BuchDatum               DATE NOT NULL,
    StartDatum              DATE NOT NULL,
    EndDatum                DATE NOT NULL,
    RechnungsNr             CHAR(12) NOT NULL CHECK(REGEXP_LIKE (RechnungsNr, '^[0-9]{12}$')),
    RechnungsDatum          DATE NOT NULL,
    Rechnungsbetrag         NUMBER(8, 2) NOT NULL,
    BewDatum                DATE NOT NULL,
    Ranking                 INTEGER NOT NULL,

    CONSTRAINT Buchung_BuchungsNR_pk PRIMARY KEY(BuchungsNR),
    CONSTRAINT Buchung_FWID_fk FOREIGN KEY (FWID) REFERENCES FerienWhng(FWID),
    CONSTRAINT Buchung_Email_fk FOREIGN KEY (Email) REFERENCES Kunde(Email),
    CONSTRAINT size_Buchung_Ranking CHECK (Ranking >= 1 AND Ranking <=5),
    CONSTRAINT size_Buchung_EndDatum_StartDatum CHECK (EndDatum >= (Startdatum + 2))
);


CREATE TABLE Anzahlung(
    AnzID                   INTEGER NOT NULL,
    BuchNr                  INTEGER NOT NULL,
    AnzBetrag               NUMBER(8, 2) NOT NULL,
    AnzDatum                DATE NOT NULL,
    CONSTRAINT Anzahlung_AnzID_pk PRIMARY KEY(AnzID),
    CONSTRAINT Anzahlung_BuchNr_fk FOREIGN KEY (BuchNr) REFERENCES Buchung(RechnungsNr)
);

Fehlerbericht -
ORA-02267: Spaltentyp nicht kompatibel mit Spaltentyp, auf den Bezug genommen wird
02267. 00000 -  "column type incompatible with referenced column type"
*Cause:    The data type or collation of the referencing column was
           incompatible with the data type or collation of the referenced
           column.
*Action:   Select a compatible data type for the referencing column.
           Also, the collation of a character column in a foreign key must
           match the collation of the corresponding column in the primary
           key.


----------



## mihe7 (13. Mai 2021)

BuchNr ist ein INTEGER, RechnungsNr ein CHAR(12).


----------



## kneitzel (13. Mai 2021)

Du hast:
BuchNr INTEGER NOT NULL,
CONSTRAINT Anzahlung_BuchNr_fk FOREIGN KEY (BuchNr) REFERENCES Buchung(RechnungsNr)

Aber in Buchung ist die RechnungsNr:
RechnungsNr CHAR(12) NOT NULL CHECK(REGEXP_LIKE (RechnungsNr, '^[0-9]{12}$')),

Das ist zumindest ein Fehler und der erste, den ich gesehen habe. Ob dies der erste ist, den Oracle gesehen hat, kann ich nicht sagen.


----------

