2016-04-08 8 views
0

Ich habe 4 Tabellenein Attribut Referenzierung, Attribute in zwei verschiedenen Tabellen

customer: CustomerID - primary key, name 

Magazine: name - primary key, cost, noofissues 

Newspaper: name - primary key, cost, noofissues 

subscription: custID - references CustomerID of Customer, name, startdate, enddate 

In dem obigen kann ich die name aus subscription Tabelle verweisen name aus Magazine und name von Newspaper zu referenzieren?

Ich habe die Tabellen Customer, Newspaper und Magazine erstellt. Ich muss nur Subscription erstellen.

Antwort

1

Können Sie so etwas tun?

CREATE TABLE subscription (
    custID  INT 
      CONSTRAINT subscription__custid__fk REFERENCES Customer(CustomerId), 
    name  VARCHAR2(50) 
      CONSTRAINT subscription__mag_name__fk REFERENCES Magazine(Name) 
      CONSTRAINT subscription__news_name__fk REFERENCES Newspaper(Name), 
    startdate DATE 
      CONSTRAINT subscription__startdate__nn NOT NULL, 
    enddate DATE 
); 

Ja, Sie können, und Sie werden zwei Fremdschlüssel auf der gleichen Spalte zeigt auf verschiedenen Tabellen haben, aber wenn der Wert in der Spalte nicht null ist, dann wird es erwarten dort sowohl in der ein passender Name sein Zeitschriftentisch und der Zeitungstisch - das ist wahrscheinlich nicht das, wonach Sie suchen.

Können Sie einen Fremdschlüssel haben, der fragt, ob der Wert entweder ausschließlich in dieser Tabelle oder in dieser Tabelle sein darf (aber nicht in beiden)?

Sie können jedoch Ihre Datenbank neu einteilen, sodass Sie die Tabellen für Zeitungen und Zeitschriften in einer einzigen Tabelle zusammenführen (auf die Sie dann leicht verweisen können); so:

CREATE TABLE customer (
    CustomerID INT 
      CONSTRAINT customer__CustomerId__pk PRIMARY KEY, 
    name  VARCHAR2(50) 
      CONSTRAINT customer__name__nn NOT NULL 
); 

CREATE TABLE Publications (
    id   INT 
      CONSTRAINT publications__id__pk PRIMARY KEY, 
    name  VARCHAR2(50) 
      CONSTRAINT publications__name__nn NOT NULL, 
    cost  NUMBER(6,2) 
      CONSTRAINT publications__cost__chk CHECK (cost >= 0), 
    noofissues INT, 
    type  CHAR(1), 
      CONSTRAINT publications__type__chk CHECK (type IN ('M', 'N')) 
); 

CREATE TABLE subscription (
    custID  INT 
      CONSTRAINT subscription__custid__fk REFERENCES Customer(CustomerId), 
    pubID  INT 
      CONSTRAINT subscription__pubid__fk REFERENCES Publications(Id), 
    startdate DATE 
      CONSTRAINT subscription__startdate__nn NOT NULL, 
    enddate DATE 
); 
1

Wenn Sie fragen, ob Sie einen Fremdschlüssel auf subscription erstellen können, die Verweise entweder die newspaper Tabelle oder die magazine Tabelle, die Antwort nein ist, kann man nicht. Ein Fremdschlüssel muss genau einen Primärschlüssel referenzieren.

Da magazine und newspaper den gleichen Satz von Attributen, die einfache Möglichkeit ist, sie in einem einzigen periodical Tisch mit einer zusätzlichen periodical_type Spalte zu kombinieren, um anzuzeigen, ob es sich um eine Zeitschrift oder eine Zeitung ist. Sie könnten dann Ihren Fremdschlüssel für die Tabelle periodical erstellen.

Obwohl es wahrscheinlich keinen Sinn in diesem speziellen Beispiel machen, könnten Sie auch separate Spalten in subscription für magazine_name haben und newspaper_name und erstellen Sie separate Fremdschlüssel-Constraints auf diesen Spalten zusammen mit einer check Einschränkung, dass das genau gewährleistet eine der Werte waren nicht NULL. Dies könnte sinnvoll sein, wenn die zwei verschiedenen Elterntabellen radikal unterschiedliche Attribute hätten.

Nicht verwandt mit Ihrer Frage, aber als ein allgemeiner Ratschlag, würde ich nicht name als Primärschlüssel verwenden. Zusätzlich dazu, dass sie ziemlich lang sind, ändern sich die Namen im Laufe der Zeit und die Namen sind nicht unbedingt einzigartig. Ich würde ein anderes Attribut für den Schlüssel verwenden, möglicherweise einen synthetischen Primärschlüssel, der aus einer Sequenz generiert wird.

Verwandte Themen