第17课 创建和操作表
本课学习基本的表创建、修改和删除。
17.1 创建表
创建数据库表的两种方式:
1、多数DBMS带有管理工具,可用于交互式地创建和管理数据库表。
2、表可由SQL声明直接操作。
以编程方式创建数据库表,可以使用CREATE TABLE SQL声明。特别指出,当你使用交互式工具,实际在使用SQL声明。然而,除了写这些声明,接口为你无缝地生成和执行SQL。
Caution:句法差异
CREATE TABLE声明的准确句法因SQL实现而异。
17.1.1 基本的表的创建
使用CREATE TABLE来创建一个表,必须指定下面的信息:
1、CTEATE TABLE关键字后面指定新表的名字。
2、逗号(,)分开的表列名字和定义。
3、有些DBMS需要你明确指定表的位置。
下面的SQL声明创建贯穿本书使用的Products表:
输入:
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);
Tip:声明格式
Replacing Existing Tables 取代存在的表
当你创建一个新表,指定的表名必须不存在的,或者你将产生一个错误。为了阻止意外覆盖(重写),SQL首先需要你手动移除一个表,再重新创建一个,而不是仅仅重写这个表。
17.1.2 Working with NULL Values
输入:
CREATE TABLE Orders
(
order_num INTEGER NOT NULL,
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT NULL
);
分析:
这个声明创建贯穿本书使用的Orders表。Orders包含3列:order number、order date和customer ID。所有三列是必需的,且每列包含关键字NOT NULL。这会阻止列插入no值。如果有人试图插入no值,将返回错误,并且插入会失败。
下面这个例子创建一个表,该表有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)
);
分析:
该声明创建Venders表。vendor ID和vendor name列都是必需的,因此明确指定为NOT NULL。剩下的5列都允许NULL值,所以没有指定为NOT NULL。 应为NULL是默认设置,所以如果没有明确指定为NOT NULL,那么假定是NULL。
Caution:指定NULL
大部分DBMS将没有明确指定NOT NULL看成指定为NULL。然而,并非都是如此。一些DBMS需要关键字NULL,如果没有明确指定将产生错误。
Tip: Primary Keys and NULL Values
第一课学习了主键是列,其值唯一确定表中的每一行。
只有那些不允许为NULL值的列能被用作Primary keys(主键)。
所有允许取值为no值的列都不能用作唯一的标识符。
Caution:理解NULL
勿混淆NULL值和空值。
NULL值指不存在一个值;它不是一个空字符串。
如果你指定' ',这在NOT NULL列中是允许的。
空字符串是一个有效的值;不是no值。
NULL值使用关键字NULL指定,不是使用空字符串指定。
17.1.3 指定默认值(Specifying Default Values)
当插入一行时,如果指定了no值,SQL允许你指定使用默认值。在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
);
分析:
该声明创建OrderItems表,该表包含组成order的单个条目。
(order本身存储在Orders表中。)quantity列包含order中每个条目的数量。在本例中,如果没有指定数量,则添加文本DEFAULT为1到列描述,就是命令DBMS使用数量为1。
默认值经常用于保存值到日期和时间戳列中。例如,通过指定涉及系统日期的函数或者变量,系统日期可用作默认日期。例如,MySQL用户可能指定DEFAULT CURRENT_DATE().
17.2 更新表
ALTER TABLE声明用于更新表定义。尽管所有的DBMS支持ALTER TABLE,允许你动态改变表的变量从一个值到另一个值。这里是考虑使用ALTER TABLE的一些关键点:
1、理想地,表应该在包含数据之后,从不再需要改变。在表的设计过程中,你应该花费充分的时间来预期(考虑)未来的需求,这样以后就不会需要大的改变了。
2、所有DBMS允许你增加列到存在的表中,尽管有时候一些限制的数据类型可能加入(如NULL和DEFAULT的使用)。
3、许多DBMS不允许你移除了改变一个表中的列。
4、许多DBMS允许你重命名列。
5、Many DBMSs restrict the kinds of changes you can make on columns that are populated and enforce fewer restrictions on unpopulated columns.