Search code examples
databaseoracle-databasereferencecreate-table

Referencing a non-PK field in Oracle


What is the correct way to reference a non-PK field? I don't understand why this example doesn't work (the field c23).

CREATE TABLE tabla1 (
    c11 CHAR(9) PRIMARY KEY,
    c12 VARCHAR2(10),  
    c13 INTEGER,
    CHECK(c13 <= 100)
);

CREATE TABLE tabla2 (
    c21 CHAR(9) PRIMARY KEY,
    c22 VARCHAR2(10),  
    c23 REFERENCES tabla1(c13)
);

Solution

  • You can't. If you want to create a foreign key constraint, you have to reference a primary or unique key column. Any other column won't work.

    For example:

    SQL> CREATE TABLE tabla1 (
      2      c11 CHAR(9)      PRIMARY KEY,
      3      c12 VARCHAR2(10),
      4      c13 INTEGER      UNIQUE,
      5      CHECK(c13 <= 100)
      6  );
    
    Table created.
    
    SQL> CREATE TABLE tabla2 (
      2      c21 CHAR(9) PRIMARY KEY  REFERENCES tabla1 (c11),
      3      c22 VARCHAR2(10),
      4      c23 INTEGER              REFERENCES tabla1(c13)
      5  );
    
    Table created.
    
    SQL>