插入数据
插入数据的几种形式:
- 插入完整的行;
- 插入行的一部分;
- 插入多行;
- 插入某些查询的结果。
插入完整的行
INSERT INTO customers
VALUES(NULL,
'Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA',
NULL,
NULL);
INSERT语句一般不会产生输出。
上述例子,第一列cust_id是由MySQL自动增量的列,指定一个NULL值,它被MySQL忽略。但是编写依赖于特定次序的SQL语句是不安全的。
# 更安全的INSERT语句
INSERT INTO customers(cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
VALUES(NULL,
'Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA',
NULL,
NULL);
因为提供了列名,VALUES必须以其指定的次序匹配指定的列名,不一定按各个列出现在实际表中的次序。其优点是,即使表的结构改变,此INSERT语句仍然能正确工作。
总是使用列的列表:一般不要使用没有明确给出列的列表的INSERT语句。
省略列:如果表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件。
- 该列定义为允许NULL值;
- 在表定义中给出默认值。这表示如果不给出值,将使用默认值。
提高整体性能:INSERT操作可能很耗时。如果检索数据是最重要的(通常是这样),则可以通过在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句优先级。
INSERT LOW_PRIORITY INTO
插入多个行
INSERT INTO customers(
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
VALUES(
'Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA'
),
(
'M. Martian',
'42 Galaxy Way',
'New York',
'NY',
'11213',
'USA'
);
提高性能:用单条INSERT语句处理多个插入比使用多条INSERT语句快。
插入检索出的数据
INSERT可以将一条SELECT语句的结果插入表中。
INSERT INTO customers(cust_id,
cust_contact,
cust_eamil,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
SELECT cust_id,
cust_contact,
cust_eamil,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country
FROM custnew;
上述例子使用INSERT SELECT从custnew中将所有数据导入customers中。
INSERT SELECT中的SELECT语句可包含WHERE子句以过滤插入的数据。
这个例子再INSERT和SELECT语句中使用了相同的列名。但是,不一定要求列名匹配。事实上,MySQL甚至不关心SELECT返回的列名,它使用的是列的位置。
更新数据
为了更新(修改)表中的数据,可使用UPDATE语句。可采用两种方式使用UPDATE:
- 更新表中特定行;
- 更新表中所有行。
不要省略WHERE子句:再使用UPDATE时一定要注意,因为稍不注意就会更新表中的所有行。
基本UPDATE语句由三部分组成:
- 要更新的表;
- 列名和它们的新值;
- 确定要更新行的过滤条件。
# 更新单列
UPDATE customers
SET cust_email = 'elmer@fudd.com'
WHERE cust_id = 10005;
# 更新多列
UPDATE customers
SET cust_name = 'The Fudds',
cust_email = 'elmer@fudd.com'
WHERE cust_id = 10005;
# 删除某个列的值
UPDATE customers
SET cust_email = NULL
WHERE cust_id = 10005;
IGNORE关键字:如果用UPDATE更新多行,并且再更新这些行中的一行或多行时出现一个错误,则整个UPDATE操作将被取消。想要即使发生错误,也继续进行更新,可使用IGNORE关键字。
UPDATE IGNORE customers ...
删除数据
为了从一个表中删除(去掉)数据,使用DELETE语句。可以两种方法使用DELETE:
- 从表中删除特定的行;
- 从表中删除所有行。
不要省略WHERE子句:同UPDATE所述。
# 删除一行
DELETE FROM customers
WHERE cust_id = 10006;
删除表的内容而不是表:DELETE语句从表中删除行,甚至时删除表中所有行,但是,DELETE不删除表本身。
更快的删除:如果想删除所有行,不要使用DELETE,可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更快(TRUNCATE实际时删除原来的表并重新创建一个表,而不是逐行删除表中数据)。
更新和删除的指导原则
- 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句;
- 保证每个表都有主键,尽可能像WHERE子句那样使用它;
- 在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确;
- 使用强制实施引用完整性的数据库,这样MySQL将不允许删除具有与其他表相关联的数据的行。
MySQL没有撤销(undo)按钮。应该非常小心地使用UPDATE和DELETE。