update语句修改报错问题处理

Update修改一批数据

UPDATE t1
SET v1=v2,
WHERE
	id IN (
	SELECT
		id 
	FROM
		t1
	WHERE
		v1=''
	
	UNION ALL
	
	SELECT
		id 
	FROM
		t1
	WHERE
		v2=''
 
	);

报错:

1093 - You can’t specify target table ‘t1’ for update in FROM clause

修改:

You can’t specify target table ‘表名’ for update in FROM clause
翻译为:不能先select出同一表中的某些值,再update这个表(在同一语句中)
结果表就是一个临时表,不能在这上面进行update。

也就是说需要把结果集当作一个表,自我查询一遍
格式为:SELECT colunm1 FROM (结果集) a

需要把临时表不被当成临时表,把自己跑一遍,修改内层语句


SELECT
	id
FROM
	(
	SELECT
		id 
	FROM
		t1
	WHERE
		v1=''
	 UNION ALL
	SELECT
		id 
	FROM
		t2
	WHERE
		v2=''

	) 
	

报错:

1248 - Every derived table must have its own alias

原因: 需要给临时表起名
这句话的意思是说每个派生出来的表都必须有一个自己的别名
一般在多表查询时,会出现此错误。
因为,进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名
把MySQL语句改成:select count(*) from (select * from ……) as total;
问题就解决了,虽然只加了一个没有任何作用的别名total,但这个别名是必须的


SELECT
	id
FROM
	(
	SELECT
		id 
	FROM
		t1
	WHERE
		v1=''
	 UNION ALL
	SELECT
		id 
	FROM
		t2
	WHERE
		v2=''
	)  table1

可查出再复制到update语句

UPDATE t1
SET v1=''
WHERE
	id IN (
		SELECT
		id
	FROM
		(
		SELECT
			id 
		FROM
			t1
		WHERE
			v1=''
		 UNION ALL
		SELECT
			id 
		FROM
			t2
		WHERE
			v2=''
		)  table1
	);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值