gooddadmike
gooddadmike

Reputation: 2369

postgresql unique constraint not unique enough

I am creating tables to handle the security question/selected question/given answer section of our database and getting this error:

there is no unique constraint matching given keys for referenced table "m_security_questions"

Not sure how I fix this?

(Since schema won't build b/c of error, I couldn't add SQL Fiddle)

CREATE TABLE security_question --defines questions
  (
    id SERIAL PRIMARY KEY NOT NULL,
    question character varying(1024) NOT NULL,
    is_custom boolean DEFAULT FALSE NOT NULL
  );

INSERT INTO security_question
  (question,is_custom)
  VALUES
    ('do you know the answer?',FALSE),
    ('Write your own question',TRUE);

CREATE TABLE m_security_questions
  ( --defines question a member chooses & allows free form question
    -- id SERIAL NOT NULL,
    -- I know adding id like this and making keeping same pk solves it 
    -- but isn't storing the extra sequence not needed?
    member integer --REFERENCES member(m_no) 
    -- commented out reference for so only 
    NOT NULL,
    question integer REFERENCES security_question(id) NOT NULL,
    m_note text,
    PRIMARY KEY(member,question)
  );

-- here I add unique constraint but doesn't the primary already mean I have a unique index?
ALTER TABLE m_security_questions ADD CONSTRAINT m_security_questions_unique_member_question UNIQUE (member,question);

INSERT INTO m_security_questions
  (member,question,m_note)
  VALUES
    (2,1,NULL),
    (2,2,'How many marbles in this jar?');


CREATE TABLE m_security_answer --defines members given answer
  ( -- I want member & question here to line up w/ same from m_security_questions
    member integer REFERENCES m_security_questions(member),
    question integer REFERENCES m_security_questions(question) NOT NULL,
    answer character varying(255) NOT NULL,
    PRIMARY KEY (member,question)
  );
    -- here is where I get the error:
    -- there is no unique constraint matching given keys for referenced table "m_security_questions"

INSERT INTO m_security_answer
  (member,question,answer)
  VALUES
    (2,1,'yes'),
    (2,2,'431');

Upvotes: 0

Views: 369

Answers (1)

Magnus Hagander
Magnus Hagander

Reputation: 25098

The primary key definitely defines a unique constraint. But the unique constraint is on (member,question). Your have two FOREIGN KEY constraints that references just (member) and (question) separately.

I'm pretty sure what you want is:

CREATE TABLE m_security_answer --defines members given answer
  (
    member integer,
    question integer NOT NULL,
    answer character varying(255) NOT NULL,
    PRIMARY KEY (member,question),
    FOREIGN KEY (member, question) REFERENCES m_security_questions(member, question)
  );

Upvotes: 2

Related Questions