daydreamer
daydreamer

Reputation: 91949

No unique constraint matching given keys for referenced table

I have a date_dimension table definition:

CREATE TABLE date_dimension
(
  id integer primary key,
  date text,
  year double precision,
  year_for_week double precision,
  quarter double precision
);

I am trying to create a fact table that fails

create table fact ( 
  id serial primary key,
  contract integer,
  component integer,
  evaluation_date integer,
  effective_date integer,
  foreign key (evaluation_date, effective_date) references date_dimension(id, id)
);

The error is :

ERROR:  there is no unique constraint matching given keys for referenced 
table "date_dimension"

SQL state: 42830 

I am not sure how to fix this.

Upvotes: 18

Views: 30234

Answers (3)

Jonathan Hall
Jonathan Hall

Reputation: 79516

The error tells you the problem: You don't have a unique constraint on date_dimension that matches your foreign key constraint.

However, this leads to the bigger design problem: Your foreign key relationship doesn't make any sense.

You could possibly solve your "problem" with:

CREATE UNIQUE INDEX date_dimension(id,id);

But that's dumb, because id is always the same. It could also be expressed as:

FOREIGN KEY (evaluation_date) REFERENCES date_dimension(id);

Then getting rid of the effective_date column, which would always be identical to evaluation_date in your example.

Or... you probably really want two FK relationships:

FOREIGN KEY (evaluation_date) REFERENCES date_dimension(id);
FOREIGN KEY (effective_date) REFERENCES date_dimension(id);

Upvotes: 15

Marc Morin
Marc Morin

Reputation: 404

Don't you just want to create two separate foreign key references to the date dimension as follows:

create table fact ( 
    id serial primary key,
    contract integer,
    component integer,
    evaluation_date integer,
    effective_date integer,
    foreign key (evaluation_date) references date_dimension(id),
    foreign key (effective_date) references date_dimension(id)
);

Upvotes: 2

Mark Byers
Mark Byers

Reputation: 837926

I think you are looking for two separate foreign keys:

foreign key (evaluation_date) references date_dimension(id),
foreign key (effective_date) references date_dimension(id)

Upvotes: 10

Related Questions