文章目录
-
第19章 插入数据
-
- 19.2 数据插入
-
19.2 插入完整的行
-
19.3 插入多个行
-
19.4 插入检索出的数据
-
第20章 更新和删除数据
-
- 20.1 更新数据
-
20.2 删除数据
-
第21章 创建和操纵表
-
- 21.1 创建表
-
21.2 更新表
-
21.3 删除表
-
21.4 重命名表
=========================================================================
顾名思义,INSERT是用来插入(或添加)行到数据库表的。插入可
以用几种方式使用:
-
插入完整的行;
-
插入行的一部分;
-
插入多行;
-
插入某些查询的结果。
INSERT INTO my_table VALUES(col1_val,col2_val,……,coln_val);
这样的插入不介意使用,一方面它依赖列的顺序,而且必须给出所有列的值。
一种更啰嗦,但更安全的做法,也是推荐的做法,
INSERT INTO my_table(
col1,
col2,
……
coln)
VALUES(
val1,
val2,
……,
valn);
这种做法没有必要给出所有列,而且不需要知道列的顺序,只需要知道有哪些列即可。
但是省略的列,必须或者可以为null,或者有默认值。
此技术可以提高数据库处理的性能,因为MySQL用单条INSERT语句处理多个插入比使用多条INSERT语句快。
INSERT INTO my_table(
col1,
col2,
……
coln)
VALUES(
val1_1,
val1_2,
……,
val1_n
),
(
val2_1,
val2_2,
……,
val2_n
);
其中单条INSERT语句有多组值,每组值用一对圆括号括起来,
用逗号分隔。
INSERT一般用来给表插入一个指定列值的行。但是,INSERT还存在
另一种形式,可以利用它将一条SELECT语句的结果插入表中。这就是所
谓的INSERT SELECT,顾名思义,它是由一条INSERT语句和一条SELECT
语句组成的。
INSERT SELECT 语句类似一种子查询。
举个例子,有customer
,custnew
(新来的客户),现在需要把新来的客户导入到customer里。怎么做?
INSERT INTO customer
(
cust_id,
cust__email,
cust_address
)
SELECT
cust_id,
cust__email,
cust_address
FROM custnew;
要注意的是,进行的匹配的
时候,仅仅是根据列出的顺序,与列名毫无关系。
============================================================================
-
要更新的表
-
列名和它们的值
-
确定要更新行的过滤条件
UPDATE my_table
SET col1 = val1,
col2 = val2,
col3 = val3
WHERE (filter condition);
注意:如果没有过滤条件,就会更新表中所有行的数据,这是一个很危险的操作。
-
在
UPDATE
语句中使用子查询也是可以的。 -
UPDATE语句具有回滚特性
如果update语句要更新很多行,有些成功更新,有些更新失败。
那么只要有一个更新失败,**则整个UPDATE操作被取消
(错误发生前更新的所有行被恢复到它们原来的值)。**。
很明显这样做是比较安全的,但是如果确实想要即使某一行发生了错误,也不妨碍其余行的更新,就可以使用IGNORE
关键字。
UPDATE IGNORE …
- 将某个列的值删除
所谓删除其实是置空,SET col = NULL
即可。
DELETE FROM my_table
WHERE (filter condition);
如果没有过滤条件,会删除所有行,这是一个很危险的操作!
DELETE不需要列名或通配符。DELETE删除整行而不是删除列。为了
删除指定的列,请使用UPDATE语句。
- 删除表的内容而不是表
DELETE语句从表中删除行,甚至是删除表中所有行。但是,DELETE不删除表本身。
- 更快的删除
如果想从表中删除所有行,不要使用DELETE。
可使用TRUNCATE table_name
语句,它完成相同的工作,但速度更(TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据)。
几条使用的建议:
- 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE
子句的UPDATE或DELETE语句。
- 在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进
行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不
正确。
- 使用强制实施引用完整性的数据库(关于这个内容,请参阅第15
章),这样MySQL将不允许删除具有与其他表相关联的数据的行。
===========================================================================
一般有两种创建表的方法:
- 使用具有交互式创建和管理表的工具(如第2章讨论的工具);
- 表也可以直接用MySQL语句操纵。
由于一般使用图形化工具创建,这里不再拘泥于语法。
讲一下注意点就好。
基本语法:
create table my_table
(
id int NOT NULL AUTO_INCREMENT ,
name char(100) NOT NULL ,
address char(200) NULL ,
PRIMARY KEY (id)
) ENGINE = InnoDB;
- 主键
主键值必须唯一。即,表中的每个行必须具有唯一的主
键值。如果主键使用单个列,则它的值必须唯一。如果使用多个列,则
这些列的组合值必须唯一。
为创建由多个列组成的主键,应该以逗号分隔的列表给出各列名,
PRIMARY KEY(colx,coly,colz)
**每个表只允许一个AUTO_INCREMENT列,而且它必须被索引(如,通
过使它成为主键)。**
- 确定AUTO_INCREMENT值
那么,如何在使用AUTO_INCREMENT列时获得这个值呢?可使
用last_insert_id()函数获得这个值,如下所示:
SELECT last_insert_id()
此语句返回最后一个AUTO_INCREMENT值,然后可以将它用于
后续的MySQL语句。
- 指定默认值
使用DEFAULT
关键字即可。
quantity int NOT NULL DEFAULT 1
- 引擎类型
创建表的时候,可以指定引擎类型,默认是InnoDB
.
以下是几个需要知道的引擎:
1 InnoDB是一个可靠的事务处理引擎(参见第26章),它不支持全文
本搜索;
2 MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘)
中,速度很快(特别适合于临时表);
3 MyISAM是一个性能极高的引擎,它支持全文本搜索(参见第18章),
但不支持事务处理。
引擎类型可以混用。
理想状态下,当表中存储数据以后,该表就不应该再被更新。
在表的设计过程中需要花费大量时间来考虑,以便后期不对该表进行大的改动。
ALTER TABLE table_name +操作
这里书上还讲了ALTER TABLE
增加外键,由于感觉比较重要。
另起一篇细讲。
复杂的表结构更改一般需要手动删除过程
-
用新的列布局创建一个新表;
-
使用
INSERT SELECT
语句(关于这条语句的详细介绍,请参阅第
19章)从旧表复制数据到新表。如果有必要,可使用转换函数和
计算字段;
-
检验包含所需数据的新表;
-
重命名旧表(如果确定,可以删除它);
-
用旧表原来的名字重命名新表;
-
根据需要,重新创建触发器、存储过程、索引和外键。
DROP TABLE table_name
注意:**这条语句删除customers 2表(假设它存在)。删除表没有确认,
也不能撤销,执行这条语句将永久删除该表。**
RENAME TABLE oldname TO newname;