17 创建和操纵表
1.创建表
一般有两种方法:
多数DBMS都具有交互式创建和管理数据库表的工具;
也可以直接用SQL语句操纵。
(1)表创建基础
新表的名字,在关键字CREARE TABLE之后给出;
表列的名字和定义,用逗号分隔;
有的DBMS还要求指定表的位置。
输入:
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price TEXT(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);
该SQL语句创建本书所用的Products表
表名紧跟CREATE TABLE关键字,实际的表定义(所有列)在圆括号内,各列之间用逗号分隔。该表由5列组成,每列的定义以列名开始,后跟列的数据类型。整条语句以圆括号后的分号结束。对于MySQL,使用TEXT替换VARCHAR。
(2)使用NULL值
允许NULL值的列允许在插入行时补不给出该列的值,而不允许NULL值的列不接受没有列值的行。每个表列不是NULL列就是NOT NULL列,在创建时由表的定义规定。
输入:
CREATE TABLE Orders
(
order_num INTEGER NOT NULL,
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT NULL,
);
该SQL语句创建本书所用的Orders表。
每一列的定义均包含关键字NOT NULL,阻止插入没有值的列。
下面的例子混合了NULL和NOT NULL,输入:
CREATE TABLE Vendors
(
vend_id CHAR(10) NOT NULL,
vend_name CHAR(50) NOT NULL,
vend_address CHAR(50) ,
vend_city CHAR(50) ,
vend_state CHAR(5) ,
vend_zip CHAR(10) ,
vend_country CHAR(50)
);
该SQL语句创建本书所用的Vendors表。
NULL为默认设置,如果不指定NOT NULL,就认为指定的是NULL。
(3)指定默认值
SQL允许指定默认值,在插入行时如果不给出值,DBMS将自动采用默认值。默认值在CREATE TABLE语句的列定义中用关键词DEFAULT指定。
输入:
CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL ,
order_item INTEGER NOT NULL ,
prod_id CHAR(10) NOT NULL ,
quantity INTEGER NOT NULL DEFAULT 1,
item_price DECIMAL(8,2) NOT NULL
);
MySQL中使用:
CREATE TABLE OrderItems
(
order_num int NOT NULL ,
order_item int NOT NULL ,
prod_id char(10) NOT NULL ,
quantity int NOT NULL ,
item_price decimal(8,2) NOT NULL
);
这条语句创建OrderItems表,包含构成定订单的各项,quantity列为订单中每个物品的数量,使用DEFAULT 1指示DBMS如果不输出数量则使用数量1。
默认值经常用于日期或时间戳列。MySQL指定系统日期的函数或变量,如DEFAULT CURRENT_DATE(),将系统日期用作默认日期。
2.更新表
使用ALTER TABLE语句更新表定义。使用时应考虑:
-
理想情况下,不要在表中包含数据是对其进行更新。在设计时应充分考虑表的可能需求,避免对其做大的改动;
-
所有的DBMS都允许给现有的表增加列,但限制增加列的数据类型;
-
许多DBMS不允许删除或更改表中的列;
-
多数DBMS允许重新命名表中的新列;
-
许多DBMS限制更改已经填有数据的列,而未填有数据的列几乎没有限制。
使用ALTER TABLE更改表结构,必须给出以下信息:
-
在ALTER TABLE之后给出要更改的表名(该表必须存在);
-
列出要做出哪些更改。
给已知表增加列,输入:
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
给Vendors表增加一个名为vend_phone的列,数据类型为CHAR。
删除列,输入:
ALTER TABLE Vendors
DROP vend_phone;
复杂的表结构更改一般需要手动删除过程,涉及一下步骤:
(1)用新的列布局创建一个新表;
(2)使用INSERT SELECT语句从旧表复制数据到新表,有必要的话,可以使用转换和计算字段;
(3)检验包含所需数据的新表;
(4)重命名旧表,如果确定,可以删除它;
(5)用旧表原来的名字重命名新表;
(6)根据需要,重新创建触发器存储过程、索引和外键。
3.删除表
使用DROP TABLE语句即可。
输入:
DROP TABLE CustCopy;
删除了第15课创建的CustCopy表。删除表没有确认,也没有撤销,执行这条语句将永久删除表。
4.重命名表
基本语法要求指定旧表名和新表名。MySQL使用RENAME语句。