Mysql update 出现 You can‘t specify target table ‘t_lw_label_attr‘ for update in FROM clause

1、更新一张表的某个字段,要求是更新后的名称不能和表里面现有的数据重复。

2、sql语句:


UPDATE t_lw_label_attr 
SET NAME = '测试名称不能重复' 
WHERE
	create_id = 19 
	AND id = 7 
	AND yn = 1 
	AND NOT EXISTS (
	SELECT
		id 
	FROM
		t_lw_label_attr 
	WHERE
		NAME = '测试名称不能重复' 
		AND yn = 1 
	)

执行后报错:You can't specify target table 't_lw_label_attr' for update in FROM clause,大概意思就是 不能再一张表里面select出一些东西当条件,然后再更新这张表。

3、解决办法就是,再子查询外面再嵌套一层,变成一张中间表就可以了。

UPDATE t_lw_label_attr 
SET NAME = '测试名称不能重复' 
WHERE
	create_id = 19 
	AND id = 7 
	AND yn = 1 
	AND NOT EXISTS (
	SELECT
		b.* 
	FROM
	( SELECT id FROM t_lw_label_attr WHERE NAME = '测试名称不能重复' AND yn = 1 ) b 
	)
	

 

这条错误信息 "You can't specify target table 'bi_panel_data' for update in FROM clause" 通常出现MySQL数据库操作中。它的含义是,你不能在一个UPDATE语句的FROM子句中直接引用要更新的目标表。这是MySQL的一个限制,可能是为了防止某些潜在的数据一致性问题。 MySQL不允许在同一个UPDATE或DELETE语句中使用FROM子句直接引用正在更新或删除的目标表,因为这可能会导致不确定的结果或者在并行环境下引起竞争条件。 例如,以下的SQL语句将会触发这个错误: ```sql UPDATE bi_panel_data SET value = value + 1 FROM bi_panel_data AS b WHERE b.id = bi_panel_data.id; ``` 在MySQL中,如果你需要根据表中的某些数据来更新同一个表,你可能需要使用子查询或者临时表来间接实现。 一个解决方式是使用子查询,如下: ```sql UPDATE bi_panel_data SET value = (SELECT value + 1 FROM bi_panel_data AS b WHERE b.id = bi_panel_data.id); ``` 或者使用一个临时表来存储需要更新的数据: ```sql CREATE TEMPORARY TABLE temp_update AS SELECT id, value + 1 AS new_value FROM bi_panel_data; UPDATE bi_panel_data, temp_update SET bi_panel_data.value = temp_update.new_value WHERE bi_panel_data.id = temp_update.id; DROP TEMPORARY TABLE temp_update; ``` 请注意,不同的数据库系统(如PostgreSQL, SQL Server等)可能允许这种操作,或者有各自的方法来处理这种情况,但在这个上下文中,我们讨论的是MySQL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

changingshow

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

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

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

打赏作者

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

抵扣说明:

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

余额充值