MySQL对表数据的增删改查的内容我们都已经学习完了。下面介绍的内容是在表的层面上,介绍表的创建、更改和删除的基本知识。
1.创建表
MySQL不仅用于对表数据操纵,而且还可以用来执行数据库和表的所有操作,包括表本身的创建和处理。
一般有两种创建表的方法:
- 使用具有交互式创建和管理表的工具;
- 表也可以直接用MySQL语句操纵。
(1)表创建基础
为利用CREATE TABLE创建表,必须给出下列信息:
- 新表的名字,在关键字CREATE TABLE之后给出;
- 表列的名字和定义,用逗号分隔。
如下示例,创建customers表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
输入: mysql> CREATE TABLE customers -> ( -> cust_id int NOT NULL AUTO_INCREMENT, -> 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, -> PRIMARY KEY (cust_id) -> )ENGINE=InnoDB; |
1)这个表由9列组成。表的主键可以在创建表时用PRIMARY KEY关键字指定。
2)处理现在的表:在创建新表时指定的表名必须不存在,否则将出错。
(2)使用NULL值
NULL值就是没有值或缺值。每个表列或者是NULL列,或者是NOT NULL列,这种状态在创建时由表的定义规定。
(3)主键再介绍
1)主键值必须唯一。如果主键使用单个列,则它的值必须唯一。如果使用多个列,则这些列的组合值必须唯一。
2)为创建由多个列组成的主键,应该以逗号分隔的列表给出各列名。
(4)使用AUTO_INCREMENT
1)AUTO_INCREMENT告诉MySQL,本列每当增加一行时自动增量。每次执行一个INSERT操作时,MySQL自动对该列增量,给该列赋予下一个可用的值。
2)每个表值允许一个AUTO_INCREMENT列,而且它必须被索引(如,通常使它成为主键)。
3)覆盖AUTO_INCREMENT:如果一个列被指定为AUTO_INCREMENT,则它需要使用特殊的值时,你可以简单地在INSERT语句中指定一个值,只要它是唯一的即可,该值被用来替代自动生成的值。
4)确认AUTO_INCREMENT值:让MySQL生成(通过自动增量)主键的一个缺点是你不知道这些值都是谁。这里可以使用last_insert_id()函数获得这个值,如下所示:
SELECT last_insert_id();
此语句返回最后一个AUTO_INCREMENT值。
(5)指定默认值
如果在插入行时没有给出值,MySQL允许指定此时使用的默认值。默认值用CREATE TABLE语句的列定义中的DEFAULT关键字指定。
考虑如下示例:
1 2 3 4 5 6 7 8 9 |
mysql> CREATE TABLE orderitems -> ( -> order_num int NOT NULL, -> order_item char(10) NOT NULL, -> prod_id char(10) NOT NULL, -> quantity int NOT NULL DEFAULT 1, -> item_price decimal(8,2) NOT NULL, -> PRIMARY KEY(order_num, order_item) -> )ENGINE=InnoDB; |
1)不允许函数:与大多数DBMS不一样,MySQL不允许使用函数作为默认值,它只支持常量。
(6)引擎类型
目前我们使用CREATE TABLE语句全都以ENGINE=InnoDB语句结束。MySQL具有多种引擎,它们具有各自不同的功能和灵活性。
以下几个需要知道的引擎:
- InnoDB是一个可靠的事务处理引擎,它不支持全文本搜索;
- MEMORY在功能等同于MyISAM,但由于数据存储在内存中,速度很快(特别适合于临时表)。
- MyISAM是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理。
2.更新表
(1)更新表定义,可使用ALTER TABLE语句。为了使用ALTER TABLE语句,必须给出下面的信息:
- 在ALTER TABLE之后给出要更改的表名
- 所做更改的列表
(2)考虑如下示例:给vendors表增加一个名为vend_phone的列,必须明确其数据类型
1 2 3 |
输入: mysql> ALTER TABLE vendors -> ADD vend_phone CHAR(20); |
(3)删除刚刚添加的列,可以这样做:
1 2 3 |
输入: mysql> ALTER TABLE vendors -> DROP COLUMN vend_phone; |
(4)ALTER TABLE的一种常见用途是定义外键,如下定理了4个外键:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
mysql> ALTER TABLE orderitems -> ADD CONSTRAINT fk_orderitems_orders -> FOREIGN KEY (order_num) REFERENCES orders (order_num); mysql> ALTER TABLE orderitems -> ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) -> REFERENCES customers(prod_id); mysql> ALTER TABLE orders -> ADD CONSTRAINT fk_orders_customers FOREIGN KEY(cust_id) -> REFERENCES customers(cust_id); mysql> ALTER TABLE products -> ADD CONSTRAINT fk_products_vendors -> FOREIGN KEY (vend_id) REFERENCES vendors(vend_id); |
3.删除表
删除表(删除整个表而不是其内容),使用DROP语句即可:
DROP TABLE customers2;
这条语句删除表customers表(假定它存在),删除表没有确认,也不能撤销。
4.重命名表
(1)使用RENAME TABLE语句可以重命名一个表:
RENAME TABLE customers2 TO customers;
(2)RENAME TABLE也可以对多个表重命名:
1 2 3 |
mysql> RENAME TABLE buckup_customers TO customers, -> buckup_vendors TO vendors, -> buckup_products TO products; |