【问题标题】:Invalid identifier but I don't want to add other foreign keys to the tables but it's not letting me标识符无效,但我不想将其他外键添加到表中,但它不允许我
【发布时间】:2013-12-03 10:06:08
【问题描述】:

粗体显示错误。我究竟做错了什么?我不想将其他主键添加到表中......那么我该如何让这个东西工作呢?我需要表仅引用 DonType,而不是表供体中的其他外键。

 CREATE TABLE PROGRAMS
    (PROGNAME NVARCHAR2 (30) NOT NULL,
    PRIMARY KEY (PROGNAME));

CREATE TABLE CAMPUS 
(CAMPNAME NVARCHAR2 (6) NOT NULL, 
 Q1 NUMBER (10, 2),
 Q2 NUMBER (10, 2),
 Q3 NUMBER (10, 2),
 Q4 NUMBER (10, 2),
 PRIMARY KEY (CAMPNAME));

CREATE TABLE LOCATED_AT
(PROGNAME NVARCHAR2 (30) NOT NULL,
CAMPNAME NVARCHAR2 (15) NOT NULL,
PRIMARY KEY (PROGNAME, CAMPNAME),
FOREIGN KEY (PROGNAME)
REFERENCES PROGRAMS
ON DELETE CASCADE,
FOREIGN KEY (CAMPNAME)
REFERENCES CAMPUS 
ON DELETE CASCADE);

CREATE TABLE DONOR
(DONNAME NVARCHAR2 (22) NOT NULL,
DONTYPE NVARCHAR2 (1) NOT NULL,
PROJECT NVARCHAR2 (15),
PRIMARY KEY (DONNAME, DONTYPE));

CREATE TABLE COMMITTEE_MEMBER
(CMNAME NVARCHAR2 (20) NOT NULL,
DONTYPE NVARCHAR2 (1) NOT NULL,
Q1 NUMBER (10, 2),
Q2 NUMBER (10, 2),
Q3 NUMBER (10, 2),
Q4 NUMBER (10, 2),
PRIMARY KEY (CMNAME, DONTYPE),
FOREIGN KEY (DONTYPE)
**REFERENCES DONOR**
ON DELETE CASCADE);

CREATE TABLE DONATION_TYPE
(DONTYPE NVARCHAR2 (1) NOT NULL,
Q1 NUMBER (10, 2),
Q2 NUMBER (10, 2),
Q3 NUMBER (10, 2),
Q4 NUMBER (10, 2),
PRIMARY KEY (DONTYPE),
FOREIGN KEY (DONTYPE)
REFERENCES DONOR
ON DELETE CASCADE);

CREATE TABLE CONTRIBUTION 
(CMNAME NVARCHAR2 (22) NOT NULL,
PROGNAME NVARCHAR2 (30) NOT NULL,
DONNAME NVARCHAR2 (22) NOT NULL,
AMOUNT NUMERIC (10, 2) NOT NULL,
DATE_ NVARCHAR2 (6) NOT NULL,
PRIMARY KEY (CMNAME, PROGNAME, DONNAME, AMOUNT, DATE_),
FOREIGN KEY (CMNAME, PROGNAME) 
REFERENCES COMMITTEE_MEMBER 
ON DELETE CASCADE, 
FOREIGN KEY (PROGNAME)
REFERENCES PROGRAMS
ON DELETE CASCADE,
FOREIGN KEY (DONTYPE)
REFERENCES DONOR
ON DELETE CASCADE);

【问题讨论】:

  • 我会使用 DONOR_TYPE 单独的表,并让 DONOR 和其余表引用它。

标签: sql database oracle key


【解决方案1】:

如果你只想引用一列,你可以这样做:

FOREIGN KEY (DONTYPE)
REFERENCES DONOR(DONTYPE)

但您只能引用包含唯一值的列。因此您必须将主键更改为仅一列或将UNIQUE 约束添加到引用的表(列)中,如下所示命令:

CREATE TABLE DONOR
(DONNAME NVARCHAR2 (22) NOT NULL,
DONTYPE NVARCHAR2 (1) NOT NULL,
PROJECT NVARCHAR2 (15),
PRIMARY KEY (DONNAME, DONTYPE),
CONSTRAINT dontype_unique UNIQUE (DONTYPE));

【讨论】:

  • 但您只能引用包含唯一值的列。 - 通常可以,但您可以禁用 UNIQUE Key 约束。那么多个值是可能的
  • 是的,我在您的回答中读到了这一点。这对我来说很新鲜,而且真的很有趣。你能引用一个禁用的唯一约束吗?
  • 是的,但有一个主要限制,外键约束也必须禁用。也许它不能解决你的问题。
【解决方案2】:

一张表只能有一个主键。但是您可以添加多个 UNIQUE 键约束。如果将它们指定为 NOT NULL,它们的行为与主键相同。为了创建外键约束,您必须在引用表上创建唯一键(或主键)约束。您也可以将此约束创建为 DISABLED,然后您还可以在其中包含重复值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2012-05-15
    • 2020-12-07
    • 2011-12-28
    • 1970-01-01
    • 2017-06-29
    • 2012-09-23
    相关资源
    最近更新 更多