Database Administrators Stack Exchange is a question and answer site for database professionals who wish to improve their database skills and learn from others in the community. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I getting an error report of:

Error report -
SQL Error: ORA-02270: no matching unique or primary key for this column-list
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

Can I know why?

parent table

    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
    );

child table

    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, 
   );

I keep nationality and fingerprint as duplicate because it will be time consuming in verifying based on all information stored in studentinfo, therefore by breaking into individual class will be easier and faster. like for the table STUDENTINFO consist 1 million record, in table bit_2015_sep_cit4114_fyp_G_ will only have 40 records. I keep the nationality column because I have 1 more column in my table structure which is visa renewal which calculated based on the value of nationality in the table.

share|improve this question
up vote 2 down vote accepted

The error occurred because you are referencing a column which is not unique. The good answers are already given by Lennart and Balazs Papp. I want to add why we need unique column in the parent table. As you said you want keep duplicate values in the column used for foreign key which is not possible while table creation. But you can create reference to the table which has already existed and contains duplicate values.
If you create primary key with non-unique index and NOVALIDATE option then it is possible. BUT this can lead to confusing results.

Let me explain a situation.

I have created a table with one column 'ID' which has got a primary key constrain with non-unique index.

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;

Now lets create another table to reference first table t1.

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

Now lets try to insert some records.

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

Now in the table t1 has a value 1 which is referencing parent table t1 which has got two values as 1. So which one the child table's id will reference to? Confused. In the above scenario the foreign key works fine but primary key in t1 works only for new values.
Conclusion:
A foreign key must always refer to a column or columns declared as either PRIMARY KEY or UNIQUE in Oracle.

share|improve this answer

Fullname etc. are not declared as unique in the parent table, and therefore you can't reference them from the child table.

Why do you need to duplicate these columns in the child table?

EDIT:

Locking at you child table you say that:

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

What this means is that there must be a unique row in STUDENTINFO with this fullname. I.e. you need to declare that table:

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

I doubt that full_name is unique which means you cant declare a foreign key against this column.

You seem to assume that there will be performance problems later on and therefore you de-normalize your database. IMO this is a big mistake, start with a normalized database and de-normalize only when there is reason to do so.

If you insist on de-normalizing you can use a trick like:

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)

Since Student_ID is unique it follows that Student_ID, Full_Name, Nationality must also be unique. I excluded Fingerprint_Template since I doubt that this can be used in foreign keys (not sure though, if it can you can add it)

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)

);

But as mentioned, start with a normalized design and see if that works

share|improve this answer
    
What it means not declared unique? – Software Engineer Feb 27 at 16:22
    
I think you have mis-understould the concept foreign key. I'll add some info to my answer that might help sort that out – Lennart Feb 27 at 16:26

Columns referenced by a foreign key constraint should have a PK or unique constraint in the referenced table. This is not true for Full_Name, Nationality, Fingerprint_Template. To be honest, those FK constraints are unnecessary, remove them, and keep the FK constraint on Student_ID. Also:

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

This is not a valid column definition. This is:

column_name varchar2(15) default '23/10/2015' not null
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.