创建表
SQL 不仅可以用来操纵表中的数据,还可以对表本身进行操纵,包括表的创建、更改和删除。
一般有两种创建表的方法:
- 用可视化的管理数据库表的工具来创建。
- 直接用 SQL 语句来创建。
其实,在用工具创建的时候,本质上也是通过 SQL 语句来创建,只不过这些 SQL 语句是工具帮我们生成的。
创建表使用CREATE TABLE
关键字,创建过程中,给出如下信息: - 新表的名字,在关键字
CREATE TABLE
之后给出。 - 表列的名字和定义,用逗号分隔。
我们以 customers 表的创建为例,创建语句如下:
CREATE TABLE customers
(
cust_id char(10) NOT NULL ,
cust_name char(50) NOT NULL ,
cust_address char(50) NULL ,
cust_city char(50) NULL ,
cust_state char(5) NULL ,
cust_zip char(10) NULL ,
cust_country char(50) NULL ,
cust_contact char(50) NULL ,
cust_email char(255) NULL
);
在创建新的表时,指定的表名必须不存在,否则会出错。为防止意外覆盖已有的表,SQL 要求首先手工删除该表,然后再重建它,而不是简单的用创建表语句覆盖它。
每个表列要么是 NULL
列,要么是 NOT NULL
列。当我们不明确指定 NULL
或 NOT NULL
时,默认为 NULL
。
SQL 允许指定默认值,在插入行时如果不给出值,DBMS 将自动采用默认值。默认值在 CREATE TABLE
语句的列定义中用关键字 DEFAULT
指定。
例如:
CREATE TABLE orderitems
(
order_num int NOT NULL ,
order_item int NOT NULL ,
prod_id char(10) NOT NULL ,
quantity int NOT NULL DEFAULT 1,
item_price decimal(8,2) NOT NULL
);
在这个例子中,这一列的描述增加了 DEFAULT 1
,指示 DBMS,如果不给出数值则使用数值 1。
默认值经常用于日期或时间戳列。例如,通过指定引用系统日期的函数 或变量, 将系统日期 用作默认日期。
在前面的课程我们提到,NULL
值就是没有值或缺值。允许 NULL 值的列允许在插入行时不给出该列的值。当指定列为 NOT NULL
时,如果有设定默认值,在插入行时,允许不给出该列的值。当指定列为 NOT NULL
时,如果没有设定默认值,在插入或更新行时,该列必须有值。如果不给出值,在插入的时候会报错。
在选择使用 DEFAULT
值还是 NULL
时,我们更倾向使用 DEFAULT
值。
更改表
在需要更新表定义时,我们可以使用 ALTER TABLE
语句。
使用 ALTER TABLE
更改表结构,必须给出下面的信息:
- 在
ALTER TABLE
之后给出要更改的表名(该表必须存在,否则将出错); - 列出要做哪些更改。
例如,我们要给 vendors 表增加一个 vend_phone 列。
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
删除刚才增加的列:
ALTER TABLE Vendors
DROP COLUMN vend_phone;
复杂的表结构更改一般需要手动删除过程,它涉及以下步骤:
- 用新的列布局创建一个新表;
- 使用
INSERT SELECT
语句从旧表复制数据到新表。 - 检验包含所需数据的新表;
- 重命名旧表(如果确定,可以删除它);
- 用旧表原来的名字重命名新表;
- 根据需要,重新创建触发器、存储过程、索引和外键。
使用 ALTER TABLE
要极为小心,应该在进行改动前做完整的备份(表结构和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,也许无法删除它们。类似地,如果删除了不应该删除的列,可能会丢失该列中的所有数据。
删除表
删除表:
删除表(删除整个表而不是其内容)非常简单,使用 DROP TABLE
语句 即可:
例如:
DROP TABLE CustCopy;
删除表没有确认,也不能撤销,执行这条语句将永远删除该表。
这一课介绍了几条新的 SQL 语句。CREATE TABLE
用来创建新表,ALTER TABLE
用来更改表列(或其他诸如约束或索引等对象),而 DROP TABLE
用来完整地删除一个表。这些语句必须小心使用,并且应该在备份后使用。
备注:示例中用到的表和数据可以通过链接(https://github.com/songw/sql)下载。