OpenGauss数据库-A.修改表及约束

07-02 1517阅读

目录

OpenGauss数据库-A.修改表及约束
(图片来源网络,侵删)

第1关:修改表名

任务描述

相关知识

编程要求

测试说明

代码

第2关:添加与删除字段(列)

任务描述

相关知识

编程要求

测试说明

代码

第3关:修改字段(列)类型

任务描述

相关知识

编程要求

测试说明

代码

第4关:添加、删除与修改约束

任务描述

相关知识

主码的删除与添加

外码的删除与添加

Check约束的删除与添加

Unique约束的删除与添加

编程要求

测试说明

代码


第1关:修改表名

任务描述

本关任务:修改表的名称。 本实验将介绍Alter table语句的大部分功能和修改表结构(添加列、约束,删除列、约束,修改列)等基础知识,这些知识将在接下来的实验中排上用场。

相关知识

修改表,包括更改表的名称,删除表中的列、约束,为表添加新的列、约束,修改名中列的名称、数据类型和约束等操作,均通过Alter Table语句来实现。

为了完成本关任务,你需要掌握: 1.Alter Table语句及其作用; 2.如何更改表名。

ALTER TABLE语句 Alter Table语句用于修改由Create Table语句创建的表的结构。比如,添加或删除列,添加或删除约束,创建或销毁索引,更改列的数据类型,更改列名甚至表名等。

ALTER TABLE的完整语法较复杂,这里仅介绍简化后的语法:

ALTER TABLE 表名 [修改事项 [, 修改事项] ...] 可见,在一条ALTER TABLE语句里,可以同时对表作多项修改。可选的修改事项有很多,常用的有:

修改事项 ::= ADD [COLUMN] 列名 数据类型 [列约束] [FIRST | AFTER col_name] | ADD {INDEX|KEY} [索引名] [类型] (列1,...) | ADD [CONSTRAINT [约束名]] 主码约束 | ADD [CONSTRAINT [约束名]] UNIQUE约束 | ADD [CONSTRAINT [约束名]] 外码约束 | ADD [CONSTRAINT [约束名]] CHECK约束 | DROP {CHECK|CONSTRAINT} 约束名 | ALTER [COLUMN] 列名 {SET DEFAULT {常量 | (表达式)} | DROP DEFAULT} | CHANGE [COLUMN] 列名 新列名 数据类型 [列约束] [FIRST | AFTER col_name] | DROP [COLUMN] 列名 | DROP {INDEX|KEY} 索引名 | DROP PRIMARY KEY | DROP FOREIGN KEY fk_symbol | MODIFY [COLUMN] 列名 数据类型 [列约束] [FIRST | AFTER col_name] | RENAME COLUMN 列名 TO 新列名 | RENAME {INDEX|KEY} 索引名 TO 新索引名 | RENAME TO 新表名 归纳一下,修改事项主要有:

用ADD关键词添加列和约束(主码、外码、CHECK、UNIQUE等约束); 用DROP关键词删除列、约束和索引(含Unique); 用MODIFY关键词修改列的定义(数据类型和约束); 用RENAME关键词修改列、索引和表的名称; 用CHANGE关键词修改列的名称,同时还可以修改其定义(类型和约束)。 需要说明的是:

注意RENAME,MODIFY和CHANGE的区别:仅改列名,用RENAME; 只改数据类型不改名,用MODIFY; 既改名又改数据类型,用CHANGE。 在用MODIFY,CHANGE更改列的数据类型和约束时,修改后的CHECK约束并不会生效。但用ADD新增列的CHECK约束,是有效的。另外,用ADD新增的CHECK约束,也会生效。 删除主码约束只能用Drop Primary Key短语,不能使用drop constraint短语,即便在创建主码约束时显式命名了该主码约束。试图使用“drop constraint 主码约束名”短语删除主码,会给出错误提示,显示该约束并不存在。 给已有列增加Default约束,可用“alter 列 set default ...”短语;删除列的default约束,可用“alter 列 drop default”短语。当然,也可以用“Modify 列名 数据类型 ...”短语。如果该短语没有default约束,就相当于删除了原来的default约束,如果该短语带有default约束,就相当于添加了default约束,如果之前已有default约束,则新的Default约束将代替原有的Default约束; 删除unique约束,既可用“drop constraint 约束名”短语,也可以用“drop key 索引名”短语来实现,唯一性(unique)约束实际是用Unique索引来实现的,Unique索引的名字总是与Unique约束名完全一样,它们本就是同一套机制。如果没有显式命名的话,Unqiue索引名或者说Unique约束名一般与列同名(组合属性作索引,则与组合属性中的第1列同名)。但要注意是的,在更改列名后,Unique索引名并不会随之更改。在创建Unqiue约束时,用“constriant”短语给约束取一个有意义的名字,是一个值得推荐的习惯。 如何更改表名 根据前面介绍的alter table语句的相关内容,易知更改表名的语句如下: alter table 表名 rename TO 新表名

编程要求

数据库GaussDB中已经有表old_table,请根据提示,在右侧代码文件编辑窗中添加恰当的语句,将表名old_table更改为new_table。

确信语句无误后,请点击“评测”按扭开始评测。 偶尔会发生评测时连不上OpenGauss的情形,(failed to connect Unknown:5432.),一般多试几次就可以了。

测试说明

平台会运行带个代码文件中的全部代码,然后检查运行后的结果是否与预期的结果完全一致。

代码

----请在以下空白处添加恰当的语句,将表名old_table更改为new_table:
--直接编写相应的SQL语句,测评时系统会连接数据库,无需在此连接数据库,余下的实验都是如此
ALTER TABLE old_table 
    RENAME TO new_table;

第2关:添加与删除字段(列)

任务描述

本关任务:为表添加和删除字段。

相关知识

为了完成本关任务,你需要掌握: 1.ALTER TABLE语句的用法; 2.如何给表添加字段; 3.如何删除表中已有的字段。

Alter Table 语句 Alter Table语句用于修改由Create Table语句创建的表的结构。比如,添加或删除列,添加或删除约束,创建或销毁索引,更改列的数据类型,更改列名甚至表名等。

在上一个实验中,我们已经介绍过该语句的用法,这里就不再赘述了,直接回顾该语句的语法:

ALTER TABLE 表名 [修改事项 [, 修改事项] ...] 可选的修改事项有:

修改事项 ::= ADD [COLUMN] 列名 数据类型 [列约束] [FIRST | AFTER col_name] | ADD {INDEX|KEY} [索引名] [类型] (列1,...) | ADD [CONSTRAINT [约束名]] 主码约束 | ADD [CONSTRAINT [约束名]] UNIQUE约束 | ADD [CONSTRAINT [约束名]] 外码约束 | ADD [CONSTRAINT [约束名]] CHECK约束 | DROP {CHECK|CONSTRAINT} 约束名 | ALTER [COLUMN] 列名 {SET DEFAULT {常量 | (表达式)} | DROP DEFAULT} | CHANGE [COLUMN] 列名 新列名 数据类型 [列约束] [FIRST | AFTER col_name] | DROP [COLUMN] 列名 | DROP {INDEX|KEY} 索引名 | DROP PRIMARY KEY | DROP FOREIGN KEY fk_symbol | MODIFY [COLUMN] 列名 数据类型 [列约束] [FIRST | AFTER col_name] | RENAME COLUMN 列名 TO 新列名 | RENAME {INDEX|KEY} 索引名 TO 新索引名 | RENAME [TO] 新表名 如何给表添加字段 随着业务发展的需要,可能需要在原有表结构的基础上添加新的字段,由于建表时的疏忽,遗漏了某个字段,也需要将遗漏的列添加到表结构中。给表添加字段的语法是:

ALTER TABLE 表名 ADD [COLUMN] 列名 数据类型 [列约束] [FIRST | AFTER 列名]

在alter table语句中指定表名,接着用关键字add column申明要添加的列,包括列的名称,数据类型,以及可选的列约束。列约束可以是主码约束、外码约束、CHECK约束、Default约束、Unique约束等其中的任何一个或一组约束。这些约束在之前的实验中都介绍过。最后,还可以指定新添加的列在表中的位置:

关键字FIRST指示新添加的列为第1列; AFTER指示新添加的列紧跟在指定列的后面。 如果省略位置指示,则新添加的列将成为表的最后一列。 关键字column可以省略。

示例: 学生表student的结构如下:

字段名称 数据类型 备注 sno char(10) 学号,主键 sname VARCHAR(32) 姓名,不允许为空值 sex char(2) 性别,取值范围:('男','女') age int 年龄

用以下语句创建了表student:

create table student( sno char(10) primary key, sname varchar(32) not null, sex char(2), age int ); 你可能已经注意到了,这条建表语句遗漏了列sex的约束,这个问题我们将在后面的实验中再解决,这里先考虑其它事情:

由于业务的发展,产生了新的需求,需要为该表添加一个字段,用于存储学生的手机号码:

字段名称 数据类型 备注 mobile char(11) 手机号码,11位数字,且第1位必须为1 怎么将列mobile(以及对该列的完整性约束)添加到表student中呢?执行下面的语句即可:

alter table student add mobile char(11) constraint CK_student_mobile check(mobile rlike '1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]') 成功添加mobile列后,可以试着执行以下几条语句观察效果: insert into student values('1','ZHAO','男',18,'13907106666'); 这条语句将插入一条数据到表student中;

再尝试执行: insert into student values('2','LI','女',18,'23907106666'); 这一次,系统将输出报错信息: ERROR 3819 (HY000): Check constraint 'CK_student_mobile' is violated. 这条错误信息提醒我们:插入的数据违反了CK_student_mobile这条约束规则(手机号码第1位必须是1)。 你也可以试着把手机号码的第1位改为1,中间的某个数字换成字母,然后再试着插入,同样会触发错误。

如何删除表中的字段 删除字段,即从表中将某个列移出,其语法格式为: ALTER TABLE 表名 DROP [COLUMN] 列名 关键字COLUMN可以省略。

示例: 回到上面的例子(表student),假设在实际运行过程中,有人对数据库的设计提出了质疑:在学生档案里记录年龄的作法并不科学,因为年龄会随着时间的变化而变化,档案里记录17岁,还得根据当年记录的日期以及当下的日期推算实际年龄。替代方案是记录出生日期而不是年龄:

字段名称 数据类型 备注 DOB date 出生日期 有两个方案实现这个改动:

用alter table student change age DOB date直接改变列名和类数据类型; 先用alter table sudent add DOB date添加列DOB,再用alter table student drop age删除列age。 如果表student是空表,则上述两个方案都是可行的。但在实际运行过程中,表student可能已经存储了数据,直接将一个int型的列改成date型的列,将出现类型不匹配错误。

另一方面,如果简单粗暴地删除列age,同时添加DOB列,则原来存储的年龄信息都将丢失。

最好的方案是先添加列DOB,然后根据当年记录时的年龄推算其大致的出生日期(相当于等价地保留了年龄数据)。在作完这个数据转换工作后,再剔除列age。这个工作共分三步:

第1步,添加列DOB: alter table student add DOB date after sex; 列DOB将位于sex之后,age之前。

第2步,根据age推算DOB: 由于表student没有记录登记年龄的日期(实际系统总会记录学生是哪个年级的,学号中也往往包含入学年份信息),这里我们假设学生是2020年9月1日入学的: update student set DOB = date '2020-9-1' - to_interval(concat(to_char(age),' year')); 根据当前年龄,计算出生日期: update t1 set sb = current_date - to_interval(concat(to_char(age),' year'));

如果你从未接触过update语句,那也没关系,可以直接跳过这一步,本实验的重点是添加列和删除列。

执行完这条update语句后,可以执行下面这条语句查看表student的内容: select * from student; 你将看到:

sno sname sex DOB age mobile 1 ZHAO 男 2002-09-01 18 13907106666 DOB列成功地转录了age的信息(以另一种表现形式)。

第3步,删除列age: alter table student drop age;

编程要求

假设数据库GaussDB中有表order(订单)和orderDetail(订单明细) 等表,两表的结构分别如下:

order表

字段名称 数据类型 备注 orderNo char(12) 订单号,主码 orderDate date 订购日期 customerNo char(12) 客户编号,外码,与customer.customerNo对应 employeeNo char(12) 雇员工号,外码,与employee.employeeNo对应 orderDetail表

字段名称 数据类型 备注 orderNo char(12) 订单号,主属性,外码,与order.orderNo对应 productNo char(12)产品编号,主属性,外码,与product.productNo对应 quantityOrdered int 订购数量 orderDate date 订购日期 注:表orderDetail的主码由(orderNo,productNo)组成

编程的任务是对orderDetail表进行修改:

orderDetail表的orderDate列明显多余,因为同一订单中的每一笔交易都发生在同一天,这个日期在订单主体表order中已有记录,请删除列orderDate。 产品的单价是订单明细需要记录的内容,请在orderDetail中添加列unitPrice以记录产品的单价: 字段名称 数据类型 备注 unitPrice numeric(10,2) 产品的成交单价 请根据提示,在右侧代码文件编辑窗中添加恰当的语句,实现上述编程任务。

确信语句无误后,请点击“评测”按扭开始评测。

请注意,编程任务仅涉及表orderDetail,你不用关注任务中提到的其它表,以及各表之间错综复杂的关系。这里给出order表的结构,仅仅为了帮助你理解本任务。

测试说明

平台会对你编写的代码进行测试,运行你写的代码,然后检查运行后的结果是否与预期的结果完全一致。

偶尔会发生评测时连不上OpenGauss的情形,(failed to connect Unknown:5432.),一般多试几次就可以了。

开始你的任务吧,祝你成功!

代码

----请在以下空白处添加适当的SQL代码,实现编程要求
----语句1:删除表orderDetail中的列orderDate
ALTER TABLE orderDetail
    DROP COLUMN orderDate;
----语句2:添加列unitPrice
ALTER TABLE orderDetail 
    ADD COLUMN unitPrice numeric(10,2);

第3关:修改字段(列)类型

任务描述

本关任务:修改字段。

相关知识

为了完成本关任务,你需要掌握: 1.ALTER TABLE语句的用法; 2.如何修改字段的数据类型和约束;

Alter Table 语句 本实训仍然要跟Alter Table语句打交道:

ALTER TABLE 表名 [修改事项 [, 修改事项] ...] 与修改列名、列数据类型和列约束,以及列序的修改事项有:

修改事项 ::= ADD [COLUMN] 列名 新列名 数据类型 [列约束] | MODIFY [COLUMN] 列名 数据类型 [列约束] | DROP [COLUMN] 列名 其中ADD短语可增加列、数据类型和列约束;MODIFY短语可修改列的数据类型和约束;DROP短语用于删除列。

如何修改字段的数据类型和约束 如果列名称不变,仅需要修改其数据类型和约束,则用MODIFY短语: ALTER TABLE 表名 MODIFY [COLUMN] 列名 数据类型 [列约束] 注意,一旦使用MODIFY短语修改列,则该列之前的数据类型、约束将被新的数据类型和约束取而代之。如果之前定义了列约束,修改后不带列约束,相当于删除了之前的约束。

如果需要修改(或添加)列的DEFAULT约束,则既可用上面的MODIFY短语,也可以使用ALTER短语: ALTER TABLE 表名 ALTER [COLUMN] 列名 SET DEFAULT {常量 | (表达式)}

删除列的DEFAULT约束,则只能使用ALTER短语: ALTER TABLE 表名 ALTER [COLUMN] 列名 DROP DEFAULT

示例

居民登记表resident的结构如下:

字段名称 数据类型 备注 name char(32) 姓名 otherNameUsed char(32) 曾用名 sex char(2) 性别 birthPlace char(32) 出生地 nationality char(10) 民族 nativePlace char(20) 籍贯 DOB date 出生日期 address char(50) 住址 religion char(16) 宗教信仰 idNo char(15) 身份证号,主码 height int 身高 bloodType char(2) 血型 educationalBackground char(6) 文化程度 maritalStatus char(4) 婚姻状况 militaryService char(8) 兵役状况 unitOfService char(40) 服务单位 occupation char(20) 职业 dateOfRegistration date 登记日期 issuedBy char(32) 签发机关 表中,居民身份证号idNo为我国于1984年开始使用的第1代身份证号,只有15位编码(其中7、8两位为出生年份)。1999年,居民身份证编号由15位升至18位:年份用4位表达,并在末尾增加了1位校验码。现在需要对表resident作如下修改:

将身份证号idNo升级到18位; 身高height的类型改为无符号整数; 可以用三条alter table语句分别实现上述需求,当然,更便捷的方法是用一条语句:

alter table resident modify idNo char(18), modify height int unsigned ;

编程要求

数据库MyDb中有表addressBook(通信录),结构如下:

字段名称 数据类型 备注 serialNo serial自动编号,主码 name char(32) 姓名 company char(32) 工作单位 position char(10) 职位 workPhone char(16) 办公电话 mobile char(11) 手机 QQ int QQ号 当初创建表的语句如下:

create table addressBook( serialNo int auto_increment primary key, name char(32), company char(32), position char(10), workPhone char(16), mobile char(11), QQ int

); 你的编程任务是对表addressBook作以下修改:

将QQ号的数据类型改为char(12); 增加一列,列名为wechat,数据类型是char(12)。 请根据提示,在右侧代码文件编辑窗中添加恰当的语句,实现上述编程任务。

确信语句无误后,请点击“评测”按扭开始评测。

测试说明

平台会对你编写的代码进行测试,运行你写的代码,然后检查运行后的结果是否与预期的结果完全一致。

开始你的任务吧,祝你成功!

代码

----请在以下空白处添加适当的SQL语句,实现编程要求
ALTER TABLE addressBook 
    MODIFY qq CHAR(12),
    ADD wechat CHAR(12);

第4关:添加、删除与修改约束

任务描述

本关任务:添加、删除与修改约束。

相关知识

为了完成本关任务,你需要掌握: 1.如何删除和添加主码约束; 2.如何删除和添加外码约束; 3.如何删除和添加CHECK约束; 4.如何删除和添加UNIQUE约束。

Alter table语句与约束 再次回顾Alter Table语句与修改约束有关的部分:

ALTER TABLE 表名 [修改事项 [, 修改事项] ...] 删除与添加约束的修改事项有:

修改事项 ::= | ADD [CONSTRAINT [约束名]] 主码约束 | ADD [CONSTRAINT [约束名]] UNIQUE约束 | ADD [CONSTRAINT [约束名]] 外码约束 | ADD [CONSTRAINT [约束名]] CHECK约束 | DROP {CHECK|CONSTRAINT} 约束名 | DROP {INDEX|KEY} 索引名 | DROP PRIMARY KEY | DROP FOREIGN KEY fk_symbol 可见,删除约束主要通过alter table语句的drop短语,添加约束则通过alter table语句的add短语来实现。

主码的删除与添加

删除主码: ALTER TABLE 表名 DROP PRIMARY KEY; 或者: drop index PRIMARY on 表名;

添加主码: ALTER TABLE 表名 ADD [CONSTRAINT [约束名]] PRIMARY KEY(列1,列2,...);

创建主码时,OpenGauss将创建主码索引;删除主码,即意味着删除主码索引。反过来,删除主码索引,也意味着删除了主码约束。

OpenGauss中,所有的主码约束(主码索引)名均为PRIMARY,无论怎么命名或更命,这个名字都不会改变。由于PRIMARY是保留字,所以,在引用这个主码约束(索引)名时,必须用一对符号单引号将PRIMARY括起来。

主码约束举例 例如,表score用于记录学生选修课程的成绩,其结构如下:

字段名称 数据类型 备注 sno char(10) 学号 cno char(10) 课程号 grade int 成绩 组合属性(sno,cno)是该表的主码。由于疏忽,用以下语句创建了该表:

create table score( sno char(10), cno char(10) not null, grade int, constraint PK_score primary key(sno) ); 显然,主码定义错了,应当删除重建:

第1步:删除错误的主码定义: alter table score drop primary key; 第2步:重新创建主码: alter table score add constraint PK_score primary key(sno,cno); 或者简单地写成: alter table score add primary key(sno,cno); 以上两种写法的结果是一样的。

当然,上述删除并重建主码的工作可用一条语句完成: alter table score drop primary key, add primary key(sno,cno); 注意多个修改项之间用逗号分隔。

外码的删除与添加

alter table语句提供了两个短语用来删除外码约束: ALTER TABLE 表名 DROP CONSTRAINT 约束名 或: ALTER TABLE 表名 DROP FOREIGN KEY 约束名 删除外码约束,必须显式给出外码约束的名字。

添加外码约束: ALTER TABLE 表名 ADD [CONSTRAINT [约束名]] 外码约束 约束名是可选的,如果省略命名短语,MySQL将按一定的规则自动命名。将来如果要删除该约束,必须先查询到该约束的名字(注:从OpenGauss的数据字典查询)。

创建外码时,OpenGauss将同步创建外码索引,如果外码约束有显式命名,则外码索引与外码约束同名。如果外码约束未命名,则外码索引与外码列的列名同名。

删除外码约束时,外码索引不会跟着删除。如果将来重新创建了外码,并显式命名,则外码索引会自动更名(与外码约束名保持相同)。

Check约束的删除与添加

删除check约束: ALTER TABLE 表名 DROP CONSTRAINT 约束名 添加check约束: ALTER TABLE 表名 ADD [CONSTRAINT [约束名]] check(条件表达式)

同样地,如果未显式命名check约束,OpenGuass将按一定规则自动予以命名。 添加约束时,如果现有数据与该约束规则相矛盾,则创建约束的请求会被拒绝。

Unique约束的删除与添加

删除Unique约束: alter table 表名 drop constraint 约束名; 或者: drop index 索引名 on 表名;

添加Unique约束: alter table 表名 ADD [CONSTRAINT [约束名]] UNIQUE(列1,...)

创建unique约束时,将同步创建unique索引,索引名与约束同名。如果未显式命名unique约束或索引,MySQL将按一定规则自动命名(单列的unique索引或约束与列同名)。

是故,删除unique索引,等同于删除unique约束。反过来,删除unique约束,也等同于删除了unique索引。

举例 现在院系表dept和学生表student,两表结构分别如下: 院系表:dept 字段名称 数据类型 备注 deptNo char(3) 院系代码,主码 deptName char(50) 院系名称 addr varchar(100) 地址

学生表:student 字段名称 数据类型 备注 sno char(10) 学号,主码 sname char(30) 姓名 mobile char(11) 手机号码 dept char(3) 所属院系,外码 除了两个主码和一个外码以下,表student还存在其它约束规则:

手机号码是唯一的,不允许重复; 手机号码第1位必须是1; 姓名是唯一的,不允许同名。 建表语句如下:

create table dept( deptNo char(3) primary key, deptName char(50), addr varchar(100) ) create table student( sno char(10) primary key, sname char(30) unique, mobile char(11), dept char(3), constraint UN_student_mobile unique(mobile), constraint FK_student_1 foreign key (dept) references dept(deptNo), constraint CK_student_mobile check(mobile like '1%') ); 显然,sname列上的unique约束未命名,而mobile列上的unique约束则给予了显式命名。

现在对表student的约束作如下调整:

列sname上的unique约束不合理,删除该约束; 列dept上的外码约束名改为:FK_student_dept; 列mobile上的check约束改为:电话号码第1位为1,接下来10位为0-9之间的数字。 约束的修改一般通过先删除旧约束再重建新约束来实现。

(1) 列sname上的unique未命名,其约束名与列名相同。可以通过以下语句删除该约束: alter table student drop constraint sname; 或 drop index sname on student; (2)为列dept上的外码约束改名: alter table student drop constraint FK_student_1; alter talbe student add constraint FK_student_dept foreign key (dept) references dept(deptNo); (3) 重新定义对mobile列的check约束: alter table student drop constraint CK_student_mobile;

alter table student add constraint CK_student_mobile check(mobile regexp '1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')

编程要求

数据库GaussDB中有以下两表:

dept(部门)

字段名称 数据类型 备注 deptNo INT 部门号,主键 deptName VARCHAR(32) 部门名称,不同部门不允许重名 tel char(11) 部门电话 mgrStaffNo int 部门经理的工号,外码

staff(职工) 字段名称 数据类型 备注 staffNo INT 工号,主键 staffName VARCHAR(32) 职工姓名 gender CHAR(1) 性别,取值范围:F-女,M-男 dob date 出生日期 Salary numeric(8,2) 工资 deptNo INT 部门号,外键 现通过以下语句,完成了两表的基础创建工作(部分约束没有实现):

create table Dept( deptNo int primary key, deptName varchar(32), tel char(11), mgrStaffNo int ); create table Staff( staffNo int, staffName varchar(32), gender char(1), dob date, salary numeric(8,2), dept int ); 请在右侧代码编辑窗每条注释的下面写出适当的语句(注释不能做任何修改,否则打回重做),完成以下工作: (1) 为表Staff添加主码; (2) Dept.mgrStaffNo是外码,对应的主码是Staff.staffNo,请添加这个外码,名字为FK_Dept_mgrStaffNo; (3) Staff.dept是外码,对应的主码是Dept.deptNo. 请添加这个外码,名字为FK_Staff_dept; (4) 为表Staff添加check约束,规则为:gender的值只能为F或M;约束名为CK_Staff_gender; 添加CHECK约束语法:条件表达式与查询的选择条件类似。 ALTER TABLE 表名 ADD [CONSTRAINT [约束名]] check(条件表达式) (5) 为表Dept添加unique约束:deptName不允许重复。约束名为UN_Dept_deptName;

测试说明

平台将执行代码文件,尝试完成上述工作,并进行相关数据验证。所有的约束名与编程要求完全一致,且约束规则也符合要求才能通过测试。

请注意区分大小写!

开始你的任务吧,祝你成功!

代码

---请在以下空白处填写适当的语句(一条语句占一行,注释不能修改),实现编程要求。
---(1) 为表Staff添加主码
ALTER TABLE Staff 
    ADD CONSTRAINT staff_pkey PRIMARY KEY(staffNo);
---(2) Staff.dept是外码,对应的主码是Dept.deptNo. 请添加这个外码,名字为FK_Staff_dept:
ALTER TABLE Staff 
    ADD CONSTRAINT FK_Staff_dept FOREIGN KEY(Dept) REFERENCES Dept(deptNo);
---(3) Dept.mgrStaffNo是外码,对应的主码是Staff.staffNo,请添加这个外码,名字为FK_Dept_mgrStaffNo:
ALTER TABLE Dept 
    ADD CONSTRAINT FK_Dept_mgrStaffNo FOREIGN KEY(mgrStaffNo) REFERENCES Staff(staffNo);
---(4) 为表Dept添加unique约束:deptName不允许重复。约束名为UN_Dept_deptName:
ALTER TABLE Dept 
    ADD CONSTRAINT UN_Dept_deptName UNIQUE(DeptName);
---(5) 为表Staff添加check约束,规则为:gender的值只能为F或M;约束名为CK_Staff_gender:
ALTER TABLE Staff 
    ADD CONSTRAINT CK_Staff_gender CHECK(gender = ANY (ARRAY['F'::BPCHAR, 'M'::BPCHAR]));
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]