SQL第17课——创建和操纵表

时间:2024-10-13 10:47:01

本课讲创建,更改和删除表的基本知识。

17.1 创建表

一般有两种创建表的方法:

1. 多数DBMS都具有交互式创建和管理数据库表的工具;

2. 表也可以直接用SQL语句操纵。

程序创建表:create table语句,使用交互式工具实际上就是使用SQL语句,这些语句不是用户自己写的,是界面工具会自动生成并执行相应的SQL语句。(不同的SQL实现,create table语法可能不同)

17.1.1 表创建基础

利用create table创建表,必须给出以下信息:

create table创建表满足项
1. 新表的名字,在关键字create table之后给出;
2. 表列的名字和定义,用逗号分隔;
3. 有的DBMS还要求指定表的位置。

例:创建所用的products表。

表的样子:

创建:(注意:已经存在的表不能二次创建)

列名必须唯一,后跟列的数据的类型。

!!!不同的DBMS,即使具有相同名称的数据类型也可能代表不同的东西。

数据类型解释1
字符串   char 1~255个字符的定长字符串。它的长度必须在创建时规定
数值数据 decimal(或者numeric) 定点或精度可变的浮点值
字符串  varchar(或long, memo, text) 变长文本

不同的DBMS的create table的语法有所不同,这条语句在绝大多数DBMS中有效,但对于DB2,必须从最后一列中去掉null.

!!!替换现有的表:创建新表,指定的表名必须不存在,防止意外覆盖已有的表,SQL要求首先手工删除该表,再重建,而不是简单地用创建表语句覆盖它。

17.1.2 使用null值

null值:就是没有值或者缺值。允许mull值的列也允许在插入行时不给出该列的值。

每一列的定义都含有关键字not null,这会阻止插入没有值的列,如果插入没有值的列,讲返回错误且插入失败。

数据类型解释2
数值数据   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所允许更新的内容差别很大。

alter table使用注意事项
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

都要求指定旧表名和新表名。