本章讲授表的创建、更改和删除的基本知识。
17.1 创建表
SQL 不仅用于表数据操纵,而且还可以用来执行数据库和表的索引操纵,包括表本身的创建和处理。
一般有两种创建表的方法:
- 多数 DBMS 都具有交互式创建和管理表的工具
- 表也可以直接用 SQL 语句操纵,CREATE TABLE 语句
17.1.1 表创建基础
为利用 CREATE TABLE 创建表,必须给出下列信息:
- 新表的名字,在关键字 CREATE TABLE 之后给出
- 表列的名字和定义,用逗号分隔
- 有的 DBMS 还要求指定表的位置
例 1,创建 Products 表:
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8, 2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);
从例 1可以看出,表名紧跟在 CREATE TABLE 关键字后面;
实际的表定义(所有列)括在圆括号中;
各列之间用逗号分隔;
每列的定义以列名(在表中必须是唯一的)开始,后跟列的数据类型;
整条语句以圆括号后的分号结束。
不同 DBMS 的 CREATE TABLE 的语法有所不同,上面的语句在 Oracle,SQL Server 等有效,而对于 MySQL,varchar 必须替换为 text
17.1.2 使用 NULL 值
每个表列或者是 NULL 列,或者是 NOT NULL 列,这种状态在创建时由表的定义规定。
允许 NULL 值的列允许在插入行时不给出该列的值
不允许 NULL 值的列不接受该列没有值的行
例 2,创建 Orders 表:
CREATE TABLE Orders
(
order_num INTEGER NOT NULL,
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT NULL
);
例 3,创建混合了 NULL 和 NOT NULL 列的表:
CREATE TABLE Vendors
(
vend_id CHAR(10) NOT NULL,
vend_name CHAR(50) NOT NULL,
vend_address CHAR(50) ,
vend_city CHAR(50) ,
vend_state CHAR(50) ,
vend_zip CHAR(50) ,
vend_country CHAR(50)
);
指定 NULL:多数 DBMS 在不指定 NOT NULL 时任务指定的 NULL
主键和 NULL 值:只有不允许 NULL 值的列可用于主键
理解 NULL:不要把 NULL 值与空串相混淆。NULL 值是没有值;它不是空串;如果指定 ' '(两个单引号,其间没有字符),这在 NOT NULL 列中是允许的。
17.1.3 指定默认值
SQL 允许指定默认值,用关键字 DEFAULT 指定,在插入行时如果不给出值,DBMS 将自动采用默认值。
例 4:
CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
item_price DECIMAL(8,2) NOT NULL
);
默认值经常用于日期或时间戳列
17.2 更新表
可使用 ALTER TABLE 语句更新表定义,使用时需要考虑的内容:
- 一般来说,在表中包含数据时不要对其进行更新。应该在表的设计过程中充分考虑未来可能的需求,以便今后不会对表的结构做大的改动
- 所有 DBMS 都允许给现有的表增加列,不过对所增加的列的数据类型(以及 NULL 和 DEFAULT 的使用)有所限制
- 许多 DBMS 不允许删除或更改表中的列
- 多数 DBMS 允许重新命名表中的列
- 许多 DBMS 对已经填有数据的列更改有限制,对未填有数据列几乎没有限制
为了使用 ALTER TABLE 更改表结构,必须给出下面的信息:
- 在 ALTER TABLE 之后给出要更改的表名(该表必须存在,否则将出错)
- 所做更改的列表
例 5,增加一个列:
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
17.3 删除表
非常简单,使用 DROP TABLE 语句即可
例 6,删除一个表:
DROP TABLE CustCopy;
17.4 重命名表
每个 DBMS 所支持的表的重命名有所不同
DB2、MySQL、Oracle 和 PostgreSQL 用户可以使用 RENAME 语句
SQL Server 和 Sybase 用户可以使用 sp_rename 存储过程
所有重命名操作的基本语法都要求指定旧表名和新表名