Search code examples
sqloracle-databaseprimary-keycreate-tablecomposite-primary-key

Where is the wrong logic in my Create Table statements?


I'm trying to run these statements and I get an error saying no matching unique or primary key for this column-list. Can you please help me how to fix this problem?

I get the problem when I try to create table SITE:

CREATE TABLE OLMP_COUNTRY (
NOC CHAR(3),
TEAM VARCHAR2(100),
CITY VARCHAR2(100),
CONSTRAINT country_pk PRIMARY KEY(NOC)
);

CREATE TABLE ATHLETE (
ATHELTE_ID CHAR(8),
NAME VARCHAR2(100),
AGE CHAR(3),
SEX CHAR(1),
HEIGHT CHAR(3), 
WEIGHT DECIMAL(3,1), 
NOC CHAR(3), 
CONSTRAINT athlete_pk PRIMARY KEY(ATHLETE_ID), 
CONSTRAINT country_fk FOREIGN KEY(NOC) REFERENCES OLMP_COUNTRY(NOC) 
); 

CREATE TABLE SITE (
NOC CHAR(3),
CITY VARCHAR2(100),
SEASON VARCHAR2(20),
YEAR CHAR(4),
CONSTRAINT site_pk PRIMARY KEY(NOC),
CONSTRAINT country_fk FOREIGN KEY(CITY) REFERENCES OLMP_COUNTRY(CITY)
);

CREATE TABLE RESULTS (
RESULT_ID CHAR(8),
MEDAL CHAR(6),
ATHLETE_ID CHAR(8),
SPORT_EVENT VARCHAR2(100), 
YEAR CHAR(4), 
GAMES VARCHAR2(50), 
CONSTRAINT results_pk PRIMARY KEY(RESULTS_ID) 
);

CREATE TABLE EVENT (
SPORT_EVENT VARCHAR2(100), 
SPORT VARCHAR2(50),
GAMES VARCHAR2(50) 
CONSTRAINT event_pk PRIMARY KEY(SPORT_EVENT)
);

Solution

  • A foreign key should be referencing the primary key of the table it is referring to.

    So I think you want:

    CREATE TABLE SITE (
        NOC CHAR(3),
        CITY VARCHAR2(100),
        SEASON VARCHAR2(20),
        YEAR CHAR(4),
        CONSTRAINT site_pk PRIMARY KEY(NOC),
        CONSTRAINT site_country_fk FOREIGN KEY(NOC) REFERENCES OLMP_COUNTRY(NOC)
    );
    

    I have no idea why you are repeating CITY in both tables, but the foreign key constraint should be to the primary key. You can look up the city using JOIN. It should not be repeated.