17.2 更新表
更新表定义,可以使用ALTER TABLE
语句。虽然所有的DBMS都支持ALTER TABLE
,但它们所允许更新的内容差别很大。以下是使用ALTER TABLE
时需要考虑的事情。
- 理想情况下,不要在表中包含数据时对其进行更新。应该在表的设计过程中充分考虑未来可能的需求,避免今后对表的结构做大改动。
- 所有的DBMS都允许给现有的表增加列,不过对所增加列的数据类型(以及
NULL
和DEFAULT
的使用)有所限制。 - 许多DBMS不允许删除或更改表中的列。
- 多数DBMS允许重新命名表中的列。
- 许多DBMS限制对已经填有数据的列进行更改,对未填有数据的列几乎没有限制。
可以看出,对已有表做更改既复杂又不统一。对表的结构能进行何种更改,请参阅具体的DBMS文档。
使用ALTER TABLE
更改表结构,必须给出下面的信息:
- 在
ALTER TABLE
之后给出要更改的表名(该表必须存在,否则将出错); - 列出要做哪些更改。
因为给已有表增加列可能是所有DBMS都支持的唯一操作,所以我们举个这样的例子:
输入▼
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
分析▼
这条语句给Vendors
表增加一个名为vend_phone
的列,其数据类型为CHAR
。
更改或删除列、增加约束或增加键,这些操作也使用类似的语法(注意,下面的例子并非对所有DBMS都有效):
输入▼
ALTER TABLE Vendors
DROP COLUMN vend_phone;
复杂的表结构更改一般需要手动删除过程,它涉及以下步骤:
- 用新的列布局创建一个新表;
- 使用
INSERT SELECT
语句(关于这条语句的详细介绍,请参阅第15课)从旧表复制数据到新表。有必要的话,可以使用转换函数和计算字段; - 检验包含所需数据的新表;
- 重命名旧表(如果确定,可以删除它);
- 用旧表原来的名字重命名新表;
- 根据需要,重新创建触发器、存储过程、索引和外键。
说明:
ALTER TABLE
和SQLite
SQLite对使用ALTER TABLE
执行的操作有所限制。最重要的一个限制是,它不支持使用ALTER TABLE
定义主键和外键,这些必须在最初创建表时指定。
警告:小心使用
ALTER TABLE
使用ALTER TABLE
要极为小心,应该在进行改动前做完整的备份(模式和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,也许无法删除它们。类似地,如果删除了不应该删除的列,可能会丢失该列中的所有数据。