【MySQL】插入/更新/删除数据

本文详细介绍了如何在 MySQL 中进行数据操作,包括插入完整行、插入多行、插入检索出的数据以及更新和删除数据。强调了在使用 UPDATE 和 DELETE 语句时务必谨慎,避免误删数据。同时提到了使用 LOW_PRIORITY 关键字来优化 INSERT 操作,以及使用 TRUNCATE TABLE 较快地清空表内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插入数据

插入数据的几种形式:

  • 插入完整的行;
  • 插入行的一部分;
  • 插入多行;
  • 插入某些查询的结果。

插入完整的行

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随处可见的打字员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值