3.2.2 基本模式定义

3.2.2 基本模式定义

创建关系 create table

我们用create table命令定义SQL关系。

下面的命令在数据库中创建了一个department关系。

1
2
3
4
5
6
create table department(
dept_name varchar(20),
building varchar(15),
budget numeric(12,2),
primary key (dept_name)
);

上面创建的关系具有三个属性:

  • dept_name是最大长度为20的字符串,
  • building是最大长度为15的字符串,
  • budget是一个12位的数,其中2位数字在小数点后面。
  • create table命令还指明了dept_name属性是department关系的主码。

create table命令格式

create table命令的通用形式是:

1
2
3
4
5
6
7
8
9
create table r(
A_1 D_1,
A_2 D_2,
...
A_n D_n,
<完整性约束1>,
...
<完整性约束n>
);

其中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是关系的一个属性的名字。

有些数据库不支持删除属性

很多数据库系统并不支持去掉属性,尽管它们允许去掉整个表。