【问题标题】:Can't add foreign key constraint to table无法将外键约束添加到表
【发布时间】:2016-05-15 09:39:38
【问题描述】:
CREATE TABLE CUSTOMER
(
    CNUM VARCHAR(25) NOT NULL,
    CNAME VARCHAR(75) NOT NULL,
    CTYPE VARCHAR(20) NOT NULL,

    CONSTRAINT CUSTOMER_PK PRIMARY KEY(CNUM),
    CONSTRAINT CHECK_CTYPE CHECK(CTYPE IN('INDIVIDUAL', 'INSTITUTION'))
);

CREATE TABLE CREDIT_TERM
(
    CREDITSTATUS VARCHAR(20) NOT NULL,
    STARTDATE DATE NOT NULL,
    ENDDATE DATE NOT NULL,

    CONSTRAINT CREDIT_TERM_PK PRIMARY KEY(CREDITSTATUS)
);


insert into CREDIT_TERM values('ONE-MONTH','15-05-2015','15-06-2015');
insert into CREDIT_TERM values('TWO-MONTH','15-05-2015','15-06-2015');
insert into CREDIT_TERM values('THREE-MONTH','15-05-2015','15-06-2015');

ALTER TABLE CUSTOMER 
ADD CONSTRAINT CUSTOMER_FK_CREDITSTATUS 
    FOREIGN KEY(CREDITSTATUS) REFERENCES CREDIT_TERM(CREDITSTATUS);

我正在尝试添加外键约束,但我不明白为什么会出现此错误:

最后一行出现错误:
ORA-00904: "CREDITSTATUS": 标识符无效

【问题讨论】:

  • 您的customer 表没有creditstatus 列。你到底想做什么?
  • 我如何添加信用状态列添加使其引用 credit_term

标签: sql oracle foreign-keys


【解决方案1】:

正如我在 cmets 中指出的,您的 customer 表没有 creditstatus 列。您首先必须添加它:

ALTER TABLE customer ADD creditstatus VARCHAR2(20);

然后用你已有的语句将它设为外键。

【讨论】:

  • 好的,如果可以说我想为客户表中记录的信用状态添加一个值,我该怎么做?
【解决方案2】:

您正在尝试为 CUSTOMER 表上名为 CREDITSTATUS 的外键添加外键约束。但是,CUSTOMER 表没有CREDITSTATUS 的外键。

您必须在CUSTOMER 中为CREDITSTATUS 创建一个外键,然后重新运行最后一行以添加约束。

编辑

使用 ALTER TABLE 将列添加到 CUSTOMER:

ALTER TABLE CUSTOMER ADD CREDITSTATUS VARCHAR(20);

文档: http://www.techonthenet.com/oracle/tables/alter_table.php

【讨论】:

  • 好的,如果可以说我想为客户表中记录的信用状态添加一个值,我该怎么做?
  • @user6235245 - 带有 UPDATE 语句
【解决方案3】:

您可以在一个语句中添加列和外键约束:

alter table customer add (
   creditstatus varchar2(20) constraint customer_fk_creditstatus references credit_term
   );

一些笔记。首先,我将列定义括在括号中。没有它们也可以工作,但官方语法似乎需要它们。 http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_3001.htm#i2103924

其次,在内联约束中(在列级别定义,而不是在表级别定义),您不能使用 FOREIGN KEY 一词。 REFERENCES 一词已经标识了约束类型。第三,如果您引用被引用表的 PRIMARY KEY,则不需要(但如果您愿意,可以)命名被引用表中的被引用列。如果您不命名列,则默认情况下将使用引用表的 PRIMARY KEY - 在绝大多数情况下,这就是您想要的。

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 2018-03-06
    • 1970-01-01
    • 2020-09-12
    • 2017-07-16
    • 2013-03-10
    • 2021-11-05
    相关资源
    最近更新 更多