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