it-swarm.com.de

ORA-02270: Kein passender eindeutiger oder Primärschlüssel für diese Spaltenliste

Ich erhalte einen Fehlerbericht von:

Fehlerbericht - 
 SQL-Fehler: ORA-02270: Kein übereinstimmender eindeutiger oder Primärschlüssel für diese Spaltenliste 
 02270. 00000 - "Keine übereinstimmende Eindeutigkeit oder Primärschlüssel für diese Spaltenliste" 
 * Ursache: Eine REFERENCES-Klausel in einer CREATE/ALTER TABLE-Anweisung 
 Gibt eine Spaltenliste an, für die es keine übereinstimmende Eindeutigkeit gibt oder primäre 
 Schlüsseleinschränkung in der Tabelle, auf die verwiesen wird. 
 * Aktion: Suchen Sie die richtigen Spaltennamen mithilfe der Katalogansicht ALL_CONS_COLUMNS 
 
.

Darf ich wissen wieso?

übergeordnete Tabelle

    CREATE TABLE STUDENTINFO
    (
      Student_ID VARCHAR2 (10) PRIMARY KEY,
      Full_Name VARCHAR2 (50) NOT NULL,
      Contact_Number NUMBER (15)NOT NULL,
      Address VARCHAR2 (50) NOT NULL,
      Nationality VARCHAR2 (15) NOT NULL,
      IC_PassportNo VARCHAR2 (15) NOT NULL,
      Programme VARCHAR (75) NOT NULL,
      Email_Address VARCHAR2 (50) NOT NULL REFERENCES                    USERNAMEPASSWORD(Username),
      Parents_Number NUMBER (15)NOT NULL,
      Fingerprint_Template clob
    );

kindertisch

    create table bit_2015_sep_cit4114_fyp_G_
    ( 
      Student_ID VARCHAR2 (10) PRIMARY KEY REFERENCES STUDENTINFO(Student_ID),
      Full_Name VARCHAR2 (50) NOT NULL REFERENCES STUDENTINFO(Full_Name),
      Nationality VARCHAR2 (15) NOT NULL REFERENCES STUDENTINFO(Nationality),
      Fingerprint_Template CLOB NOT NULL REFERENCES        STUDENTINFO(Fingerprint_Template),
     "23/10/2015" VARCHAR2 (15) not null, 
   );

Ich behalte Nationalität und Fingerabdruck als Duplikat, da die Überprüfung anhand aller in studentinfo gespeicherten Informationen zeitaufwändig ist. Daher ist es einfacher und schneller, in einzelne Klassen einzusteigen. Wie für die Tabelle STUDENTINFO bestehen 1 Million Datensätze, in der Tabelle bit_2015_sep_cit4114_fyp_G_ werden nur 40 Datensätze vorhanden sein. Ich behalte die Spalte mit der Staatsangehörigkeit, da ich in meiner Tabellenstruktur eine weitere Spalte habe, die die Visumerneuerung darstellt und auf der Grundlage des Werts der Staatsangehörigkeit in der Tabelle berechnet wird.

5

Der Fehler ist aufgetreten, weil Sie auf eine Spalte in einer anderen Tabelle verweisen, die nicht eindeutig ist. Die guten Antworten geben bereits Lennart und Balazs Papp.

Ich möchte erklären, warum wir eine eindeutige Spalte in der übergeordneten Tabelle benötigen. Wie Sie sagten, möchten Sie doppelte Werte in der für den Fremdschlüssel verwendeten Spalte behalten, was beim Erstellen der Tabelle nicht möglich ist. Sie können jedoch einen Verweis auf eine vorhandene Tabelle erstellen, die doppelte Werte enthält.

Wenn Sie einen Primärschlüssel mit nicht eindeutigem Index und der Option NOVALIDATE erstellen, ist dies möglich. ABER dies kann zu verwirrenden Ergebnissen führen.

Lassen Sie mich eine Situation erklären.

Ich habe eine Tabelle mit einer Spalte ID erstellt, die eine Primärschlüsseleinschränkung mit einem nicht eindeutigen Index aufweist.

SQL>CREATE TABLE t1(id NUMBER);
SQL>CREATE INDEX t1_index on t1(id);
SQL>INSERT INTO t1 VALUES(1);
SQL>INSERT INTO t1 VALUES(1);
SQL>COMMIT;
SQL>SELECT id FROM t1;

    ID
----------
     1
     1

SQL>ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id) USING INDEX t1_index NOVALIDATE;

Erstellen wir eine weitere Tabelle, um auf die erste Tabelle zu verweisen.

SQL>CREATE TABLE t2(id NUMBER, CONSTRAINT t2_fk FOREIGN KEY(id) REFERENCES t1(id));

Generieren Sie einige Datensätze.

SQL>INSERT INTO t2 VALUES(1);
SQL>COMMIT;

Tabelle t2 hat einen Wert 1 die auf die übergeordnete Tabelle verweist t1 mit einem doppelten Wert von 1. Auf welche bezieht sich die id der untergeordneten Tabelle?

Im obigen Szenario funktioniert der Fremdschlüssel einwandfrei, der Primärschlüssel in Tabelle t1 funktioniert nur für neue Werte.

Schlussfolgerung : Ein Fremdschlüssel muss sich immer auf eine oder mehrere Spalten beziehen, die in Oracle entweder als PRIMARY KEY oder UNIQUE deklariert sind.

5
JSapkota

Vollständiger Name usw. werden in der übergeordneten Tabelle nicht als eindeutig deklariert. Daher können Sie sie nicht aus der untergeordneten Tabelle referenzieren.

Warum müssen Sie diese Spalten in der untergeordneten Tabelle duplizieren?

BEARBEITEN:

Wenn Sie sich an Ihren Kindertisch schließen, sagen Sie Folgendes:

create table bit_2015_sep_cit4114_fyp_G_
( ...
, Full_Name VARCHAR2 (50) NOT NULL 
      REFERENCES STUDENTINFO(Full_Name)

Dies bedeutet, dass in STUDENTINFO eine eindeutige Zeile mit diesem vollständigen Namen vorhanden sein muss. Das heißt, Sie müssen diese Tabelle deklarieren:

CREATE TABLE STUDENTINFO
( ...
, Full_Name VARCHAR2 (50) NOT NULL
     UNIQUE,

Ich bezweifle, dass full_name eindeutig ist, was bedeutet, dass Sie keinen Fremdschlüssel für diese Spalte deklarieren können.

Sie scheinen davon auszugehen, dass es später zu Leistungsproblemen kommen wird, und normalisieren daher Ihre Datenbank. IMO ist dies ein großer Fehler. Beginnen Sie mit einer normalisierten Datenbank und de-normalisieren Sie nur, wenn Grund dazu besteht.

Wenn Sie auf einer De-Normalisierung bestehen, können Sie einen Trick anwenden wie:

CREATE TABLE STUDENTINFO
( Student_ID VARCHAR2 (10) PRIMARY KEY
, Full_Name VARCHAR2 (50) NOT NULL
, Contact_Number NUMBER (15)NOT NULL
, Address VARCHAR2 (50) NOT NULL
, Nationality VARCHAR2 (15) NOT NULL
...
,    constraint AK1_STUDENTINFO unique (Student_ID, Full_Name, Nationality)

Da Student_ID eindeutig ist, muss Student_ID, Full_Name, Nationality ebenfalls eindeutig sein. Ich habe Fingerprint_Template ausgeschlossen, da ich bezweifle, dass dies in Fremdschlüsseln verwendet werden kann (ich bin mir jedoch nicht sicher, ob Sie es hinzufügen können).

create table bit_2015_sep_cit4114_fyp_G_
( Student_ID VARCHAR2 (10) PRIMARY KEY
, Full_Name VARCHAR2 (50) NOT NULL 
, Nationality VARCHAR2 (15) NOT NULL
...
,    constraint fk_studentinfo foreign key (Student_ID, Full_Name, Nationality)
                references studentinfo (Student_ID, Full_Name, Nationality)

);

Beginnen Sie jedoch, wie bereits erwähnt, mit einem normalisierten Design und prüfen Sie, ob dies funktioniert

6
Lennart

Spalten, auf die durch eine Fremdschlüsseleinschränkung verwiesen wird, sollten in der referenzierten Tabelle eine PK oder eine eindeutige Einschränkung aufweisen. Dies gilt nicht für Full_Name, Nationality, Fingerprint_Template. Um ehrlich zu sein, sind diese FK-Einschränkungen nicht erforderlich. Entfernen Sie sie und behalten Sie die FK-Einschränkung für Student_ID. Ebenfalls:

"23/10/2015" VARCHAR2 (15) not null, 

Dies ist keine gültige Spaltendefinition. Das ist:

column_name varchar2(15) default '23/10/2015' not null
3
Balazs Papp