3.2.2 基本模式定义
创建关系 create table
我们用create table
命令定义SQL
关系。
下面的命令在数据库中创建了一个department
关系。
1 | create table department( |
上面创建的关系具有三个属性:
dept_name
是最大长度为20的字符串,building
是最大长度为15的字符串,budget
是一个12位的数,其中2位数字在小数点后面。create table
命令还指明了dept_name
属性是department
关系的主码。
create table命令格式
create table
命令的通用形式是:
1 | create table r( |
其中r
是关系名,每个A_n
是关系r
模式中的一个属性名,D_n
是属性A_n
的域,也就是说D_n
约束了属性A_n
的类型以及可选的范围,是用于限制所允许的A取值的集合。
命令以分号结束
create table
命令后面用分号结束,本章后面的其他SQL
语句也是如此,在很多SQL
实现中分号是可选的。
完整性约束
SQL
支持许多不同的完整性约束。在本节我们只讨论其中少数几个:
primary key
primary key(A1, A2,...,Am)
: primary key
声明表示属性A1,A2,…,Am
构成关系的主码。主码属性必须非空且唯一。也就是说没有一个元组在主码属性上取空值,关系中也没有两个元组在所有主码属性上取值相同。虽然主码的声明是可选的,但为每个关系指定一个主码通常会更好。
foreign key
foreign key(A1,A2,... An) references 关系S
:foreign key
声明表示关系中任意元组在属性(A1,A2,…,An)
上的取值必须对应于关系s
中某元组在主码
属性上的取值。
not null
not null
:一个属性上的not null
约束表明在该属性上不允许空值。
SQL不允许破坏完整性约束的命令执行
SQL
禁止破坏完整性约束的任何数据库更新。
主码不能为空 主码不能重复
例如,如果关系中一条新插入或新修改的元组在任意一个主码
属性上有空值,或者元组在主码属性上的取值
与关系中的另一个元组的主码属性值相同,SQL
将标记个错误,并阻止更新。
外码要在被参照关系中存在
类似地,如果插入的course
元组在dept_name
上的取值没有出现在department
关系中,就会破坏course
上的外码约束,SQL
会阻止这种插入的发生。
插入元组 insert into
1 | insert into instructor values(10211, "Smith", "Biology",66000); |
删除元组 delete from
1 | delete from student; |
删除关系 drop table
如果要从SQL
数据库中去掉一个关系,我们使用drop table
命令。 drop table
命令从数据库中删除关于被去掉关系的所有信息。
drop table 和delete from
命令drop table r;
是比delete from r;
更强的语句。
delete from r;
只是删除r
中的所有元组,但会保留关系r
。drop table r;
不仅删除r
的所有元组,还删除r
的模式。此时,除非用create table
命令重建关系r
,否则无法将元组可以插入到关系r
中。
alter table
为已有的关系增加属性 alter table r add A D
使用alter table
命令可以给已有关系增加属性。关系中的所有元组在新增加的属性上的取值将被设为null
,alter table
命令的格式为:
1 | alter table r add A D |
其中r
是现有关系的名字,A
是待添加属性的名字,D
是待添加属性的域。
从关系中去掉属性 alter table r drop A
通过命令alter table r drop A
可以从关系中去掉属性。
其中r
是现有关系的名字,A
是关系的一个属性的名字。
有些数据库不支持删除属性
很多数据库系统并不支持去掉属性,尽管它们允许去掉整个表。
原文链接: 3.2.2 基本模式定义