问题描述
首先非常感谢您的帮助。我在这里是因为我不知道如何为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_id
为NOT 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),) ;
请注意,我重命名了该列并更改了它的数据类型,使其与所引用的列一致。