【问题标题】:How to check foreign key constraint exists in oracle sql如何检查oracle sql中是否存在外键约束
【发布时间】:2021-02-08 20:23:37
【问题描述】:

首先非常感谢您的帮助。我在这里是因为我不知道如何为 Video 表编写一个约束,以便在 Video 表中创建新行之前检查“Categories”表中是否存在一个类别。

分类表:

CREATE TABLE Categories(
cat_id integer,
cat_name varchar2(128)
CONSTRAINT pk_cat PRIMARY KEY (cat_id, cat_name) 
);

视频表:

CREATE TABLE Video(
video_id integer PRIMARY KEY,
title varchar2(128) NOT NULL,
description varchar2(128) NOT NULL,
categorie varchar2(32),
CONSTRAINT fk_vid_cat FOREIGN KEY (categorie) REFERENCES Categories,
--CONSTRAINT ck_cat_exists CHECK categorie EXISTS (cat_name) REFERENCES Categories
) ;

不知道能不能直接从这里做,再次感谢大家的帮助...

【问题讨论】:

    标签: sql oracle foreign-keys create-table


    【解决方案1】:

    你想要 id 而不是名字:

    CREATE TABLE Videos (
        video_id integer PRIMARY KEY,
        title varchar2(128) NOT NULL,
        description varchar2(128) NOT NULL,
        cat_id integer,
        CONSTRAINT fk_vid_cat FOREIGN KEY (cat_id) REFERENCES Categories(cat_id)
    ) ;
    

    如果要确保每个视频都有一个类别,则将cat_id 声明为NOT NULL

    拥有主键的目的是为了避免在整个数据库中重复字符串值。

    【讨论】:

      【解决方案2】:

      您所要求的正是外键约束功能所提供的。

      我将首先更改类别表的定义,使其仅使用 cat_id 作为主键(而主键中还有 cat_name,这实际上没有意义):

      create table categories(
          cat_id integer,
          cat_name varchar2(128)
          constraint pk_cat primary key (cat_id) 
      );
      

      然后你可以在视频表中引用它:

      create table video(
          video_id integer,
          title varchar2(128) not null,
          description varchar2(128) not null,
          cat_id integer,
          constraint pk_video primary key (video_id),
          constraint fk_vid_cat foreign key (cat_id) references categories(cat_id),
      ) ;
      

      请注意,我重命名了该列并更改了其数据类型,使其与引用的列保持一致。

      【讨论】:

      • 感谢您的帮助!!现在更好地理解 :-) 只是一个小问题:在您的视频表中,我可以删除 video_id 声明中的“主键”吗?还是我必须声明 2 次(约束 + 声明)?谢谢
      • @FedericoCtr:我的错,我没有注意到内联声明。一个就够了!我修复了我的代码。
      猜你喜欢
      • 2011-05-22
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多