如果它是多个候选键,SQL不允许外键?

时间:2011-12-04 04:14:02

标签: sql oracle oracle10g foreign-keys

SQL中是否允许使用不是主键但是(多个)唯一键的外键?具体来说:

[表1]

CREATE TABLE Session_Record(
c_id CHAR (3) NOT NULL
    REFERENCES Club_Record(c_id),
sess_id NUMBER (4) NOT NULL CHECK (sess_id >0)
room CHAR (4) NOT NULL,
UNIQUE(c_id, sess_id)
);

[表2]

CREATE TABLE SessionDuration__Record(
c_id CHAR (3) NOT NULL
    REFERENCES Club_Record(c_id),
sess_id NUMBER (4) NOT NULL CHECK (sess_id >0)
    REFERENCES Session_Record(sess_id),
day CHAR(9) NOT NULL,
duration NUMBER(3) NOT NULL,
UNIQUE(c_id, sess_id)
);

“c_id”是表Club_Record中的主键。但sess_id不是主键。它是与c_id组合的多个候选键。这种形式的声明是否允许在SQL中使用?因为Oracle 10g正在为(sess_id)外键语句返回:“此列列表没有匹配的唯一键或主键”。 非常感谢帮助!

2 个答案:

答案 0 :(得分:2)

这正是消息所说的。 SessionDuration__Record上的“sess_id”不能是引用Session_Record上相同命名列的外键,因为该列不是唯一的。

例如,如果Session_Record上有两个不同的记录,但它们具有相同的sess_id值,则SessionDuration__Record无法知道要引用的两个记录中的哪一个。

答案 1 :(得分:2)

您的SQL在几种不同的方式中无效(在Session_Record.sess_id定义后缺少逗号;使用day作为标识符而不引用它),但只是坚持您明确要求的问题关于 - 我猜你真正想要的是这个:

CREATE TABLE SessionDuration__Record
(
    c_id      CHAR(3)    NOT NULL  REFERENCES Club_Record(c_id),
    sess_id   NUMBER(4)  NOT NULL  CHECK (sess_id >0),
    "DAY"     CHAR(9)    NOT NULL,
    duration  NUMBER(3)  NOT NULL,
    UNIQUE(c_id, sess_id),
    FOREIGN KEY (c_id, sess_id) REFERENCES Session_Record(c_id, sess_id)
);

也就是说,您希望确保每个(SessionDuration__Record.c_id, SessionDuration__Record.sess_id)对应现有的(Session_Record.c_id, Session_Record.sess_id)