如何检查Oracle SQL中是否存在外键约束

问题描述

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

类别表:

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
) ;

我不知道是否可以直接从这里完成,非常感谢您的再次帮助...

解决方法

您想要的是 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_idNOT NULL

拥有主键的目的是使您不必在整个数据库中重复字符串值。

,

您要的就是外键约束功能提供的功能。

我将从更改类别表的定义开始,以便它仅将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,constraint pk_video primary key (video_id),constraint fk_vid_cat foreign key (cat_id) references categories(cat_id),) ;

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