1.创建基本表或临时表
在 GBase 8a 中,创建表的语法格式为:
CREATE [TEMP] TABLE <表名>
(
<列名 1> <数据类型> [列级完整性约束],
<列名 2> <数据类型> [列级完整性约束],
…
[表级完整性约束 1],
[表级完整性约束 2],
…
) [IN “<表的存放路径>”];
其中 TEMP 表示建的表是临时表;表名要唯一,字段要唯一;CONNECT 权限的用户只能创建这样的临时表(这样的临时表可以有索引,也可以没有索引),并可以用它进行存取,但不可以进行 ALTER 和 DROP 操作。
创建基本表时需要指定表名、表中每个列的定义以及完整性约束情况。可以将创建基本表想象为搭建一个用于容纳数据的框架。描述这个框架本身的数据被称为元数据(Metadata),即关于数据的数据,例如,表名、列名和列的数据类型等。
例 1.5 创建 Stores5 数据库的顾客表:
create table customer (
customer_num
SERIAL,
cname CHAR(15) not null,
company CHAR(20),
address CHAR(20),
state CHAR(20),
phone CHAR(18) not null,
primary key (customer_num) constraint PK_CUSTOMER
);
上面的语句在数据库中创建了基本表 customer。客户表 customer 由 7 列组成,每个列的定义必须指明列名和数据类型,然后是可选的列级完整性约束。考虑到客户名称和联系电话列不为空,因此为 cname 和 phone 添加非空约束 NOT NULL。除非空约束外,列级完整性约束还可以选择添加唯一约束(Unique)。本表的表级完整性约束设置了一个名为PK_CUSTOMER 的主键约束(Primary Key Constraint),将 customer_num 列定义为主键。由于主键默认含有非空和唯一约束,因此不必为 customer_num 定义 NOT NULL。
例 1.6 创建 Stores5 数据库的订单表:
create table orders (
order_num SERIAL,
customer_num INTEGER,
order_date DATE not null,
ship_date DATE,
paid_date DATE,
primary key (order_num) constraint PK_ORDERS,
foreign key (customer_num) references customer (customer_num) constraint
FK_RELATIO_CUSTOMER
);
在创建 orders 表时,除了设置了一个主键约束,由于其 customer_num 列是由 customer表的主键 customer_num 引用而来的,所以设置了一个名为 FK_RELATIO_CUSTOMER 的引用约束(Referential Constraint),也叫外键约束)。引用约束用来表示数据表之间或数据表内的关系。一个数据表的主键可以被同一个数据表或其他数据表引用。主键被引用的数据表被称为父表(Parent Table),引用了父表的主键的数据表被称为子表(Child Table)。
例 1.7 创建 Stores5 数据库的订单明细表:
create table items (
item_num SERIAL,
order_num INTEGER,
ship_name CHAR(20),
ship_price MONEY(6,2),
quantity
SMALLINT,
check (quantity >0 and quantity <10000) constraint CK_QUANTITY,
primary key (item_num) constraint PK_ITEMS
);
除了在列后定义列级完整性约束后,有时需要对输入的数据按照设置的逻辑进行检查,这就需要检查约束(Check Constraint)。在向表中添加数据时,这个约束会对输入的数据按照设置的逻辑进行检查。在本 items 表中,由于厂商仓库的容量大小限制,定义的 quantity列的值应该是 0~10000 的整数,所以定义了检查约束 CK_QUANTITY ,以检查数据是否满足条件。