本课讲创建,更改和删除表的基本知识。
17.1 创建表
一般有两种创建表的方法:
-
多数DBMS都具有交互式创建和管理数据库表的工具;
-
表也可以直接用SQL语句操纵。
程序创建表:create table语句,使用交互式工具实际上就是使用SQL语句,这些语句不是用户自己写的,是界面工具会自动生成并执行相应的SQL语句。(不同的SQL实现,create table语法可能不同)
17.1.1 表创建基础
利用create table创建表,必须给出以下信息:
|--------------------------------|
| 1. 新表的名字,在关键字create table之后给出; |
| 2. 表列的名字和定义,用逗号分隔; |
| 3. 有的DBMS还要求指定表的位置。 |
[create table创建表满足项]
**例:**创建所用的products表。
表的样子:
创建:(注意:已经存在的表不能二次创建)
列名必须唯一,后跟列的数据的类型。
!!!不同的DBMS,即使具有相同名称的数据类型也可能代表不同的东西。
|------------------------------------|------------------------------|
| 字符串 char | 1~255个字符的定长字符串。它的长度必须在创建时规定 |
| 数值数据 decimal(或者numeric) | 定点或精度可变的浮点值 |
| 字符串 varchar(或long, memo, text) | 变长文本 |
[数据类型解释1]
不同的DBMS的create table的语法有所不同,这条语句在绝大多数DBMS中有效,但对于DB2,必须从最后一列中去掉null.
**!!!替换现有的表:**创建新表,指定的表名必须不存在,防止意外覆盖已有的表,SQL要求首先手工删除该表,再重建,而不是简单地用创建表语句覆盖它。
17.1.2 使用null值
**null值:**就是没有值或者缺值。允许mull值的列也允许在插入行时不给出该列的值。
每一列的定义都含有关键字not null,这会阻止插入没有值的列,如果插入没有值的列,讲返回错误且插入失败。
|----------------------------------|------------------------------------|
| 数值数据 integer (或int) | 4字节整数值,支持-2147483648~2147483647的数 |
| 日期和时间数据 datetime(或timestamp) | 日期时间值 |
[数据类型解释2]
**例:**创建混合了null和not null列的表
null为默认设置,如果不指定not null,就认定指定的是null.
**!!!**有些DBMS要求指定关键字null,不指定会出错。
!!!主键是其值唯一标识表中每一行的列。只能是not null的。
**null:**没有值
**'':**空字符串,是一个有效值,not null
17.1.3 指定默认值
SQL允许指定默认值,插入行时不给出值,将采用默认值。
默认值 在create table语句的列定义中用关键字default指定。
例:
**defulat 1:**指示DBMS,如果不给出数量则使用数量1.
默认值常用于日期或时间戳列,将系统日期用作默认日期。
MySQL:指定default current_date()获得系统日期的命令。
17.2 更新表
使用alter table语句更新表定义,不同的DBMS所允许更新的内容差别很大。
|-------------------------------------------------------|
| 1. 不要在表中包含数据时进行更新。在设计表过程中充分考虑未来可能的需求,避免今后对表的结构做大改动。 |
| 2. 所有DBMS允许给现有的表增加列,但是对增加列的数据类型(null,和default的使用)有限制。 |
| 3. 许多DBMS不允许删除或更改表中的列。 |
| 4. 多数DBMS允许重新命名表中的列。 |
| 5. 许多DBMS限制已经填有数据的列进行更改,对未填有数据的列几乎没有限制。 |
[alter table使用注意事项]
alter table更改表结构,必须给出下面的信息:
-
alter table之后给出要更改的表名(表必须存在,否则将出错)
-
列出要做哪些更改。
**例:**对已有表增加列(所有DBMS都支持的唯一操作)
增加了一列vend_phone
更改或删除列,增加约束或增加键,这些操作也使用类似的语法。
**例:**并非对所有DBMS都有效,
复杂的表结构更改一般需要手动删除过程,步骤:
-
用新的列布局创建一个新表;
-
使用insert select 语句(15课)从旧表复制数据到新表。有必要的话,使用转换函数和计算字段;
-
检验包含所需数据的新表;
-
重命名旧表(如果确定,可以删除它)
-
用旧表原来的名字重命名新表;
-
根据需要,重新创建触发器,存储过程,索引和外键。
使用alter table之前,应该做好完整的备份(表结构和数据备份)!!!数据库表的更改不能撤销。
17.3 删除表
删除表(整个表,而不是其内容),使用drop table语句。
17.4 重命名表
|-----------------------------------------|-------------|
| DB2, MariaDB, MySQL, Oracle, PostgreSQL | rename |
| SQL Server | sp_rename |
| SQLite | alter table |
都要求指定旧表名和新表名。