数据库系统原理(三)表的定义
SQL数据定义
SQL的DDL(数据定义语言)不仅能够定义一组关系,还能够定义每个关系的信息,包括:
- 每个关系模式
- 每个属性的取值类型
- 完整性约束
- 每个关系维护的索引集合
- 每个关系的安全性和权限信息
- 每个关系在磁盘上的物理存储结构
CRATE TABLE instructor(
ID char(5),
name varchar(20) not null,
dept_name varchar(20),
salary numeric(8,2),
primary key (ID)
);
基本类型
- char(n) :固定长度字符串,用户指定长度n
- varchar(n):可变长度的字符串,用户指定最大长度n
- int: 整数类型(和及其相关的整数类型),等价于全程interger
- smallint: 小整数类型(和机器相关的整数类型的子集)
- numeric(p,d):定点数,精度由用户指定。这个数由p位数字,其中d位数字在小数点右边
- real,double precision:浮点数与双精度浮点数,精度与机器相关
- float(n):精度至少为n位的浮点数
- null: 每种类型都可以包含一个特殊值,即空值。可以声明属性值不为空
- date: 日期,含年,月,日 如“2015-3-20”
- time: 时间,含小时,分钟,秒,如‘08:15“30’
- timestamp :日期+时间
注:日期和时间类型在SQL Sever 2000中用‘datetime’ 表示
基本模式定义
我们用create table命令定义SQL关系:
CRATE TABLE r
(A1 D1,A2 D2,…,An Dn,
<完整性约束1>,
…,
<完整性约束k>);
其中,r是关系名,每个Ai是关系r模式中的一个属性名,Di是属性Ai的域
SQL支持许多不同的完整性约束
- not null 一个属性上的not null 约束表明在该属性上不允许空值
- primary key(A1,…,An),声明表示属性A1,…,An构成关系的主码。主码属性必须非空且唯一
- foreign key(A1,…,Am)references ,声明表示关系中任意元组在属性上(A1,…,Am)上的取值必须对应于关系s中某元组的主码属性上的取值
- check(p),p是谓词条件
//声明ID为instructor的主码,并确保salary的值非负
//方法1
CREATE TABLE instructor
(
ID char(5),
dept_name varchar(20),
salary numeric(8,2),
primary key (ID),
check(salary >= 0)
);
CREATE TABLE instructor
(
ID char(5) primary key,
name varchar(20),
depet_name varchar(20),
salary numeric(8,2),
check (salary >= 0)
);
基本命令
drop table:从数据库删除关于被去掉关系的所有信息
- DROP TABLE r;
- 如 DROP TABLE instructor2;
alter table add为已有关系增加属性
- ALTER TABLE r ADD A D;
- 其中A是待添加属性的名字,D是待添加属性的域。关系中所有元组在新属性上的取值将被设为null
- 如 ALTER TABLE instructor add birthday date;
alter table drop 从关系中去掉属性
- ALTER TABLE r DROP A
- 但是很多数据库系统不支持此操作
alter table modify 修改关系中的属性
- 如,ALTER TABLE instructor MODIFY(ID char(10))