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)外键语句返回:“此列列表没有匹配的唯一键或主键”。 非常感谢帮助!
答案 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)
。