[转]mysql delete 使用别名 语法

原文地址:https://www.cnblogs.com/wuyun-blog/p/6178303.html

今天删除数据,写了这么条sql语句,

DELETE   from  sys_menus s WHERE s.MENU_ID in (86,87,88);

结果报错。。

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's WHERE s.MENU_ID in (86,87,88)' at line 1

 

后来一查,mysql使用别名有固定的语法。

当然不用也行:DELETE  from  sys_menus   WHERE  MENU_ID in (86,87,88);

用别名的:DELETE s from  sys_menus s WHERE s.MENU_ID in (86,87,88);

 

转的!原博文网址:http://blog.youkuaiyun.com/chs_jdmdr/article/details/46708917

mysql delete 语句中使用别名 alias

delete <alias> from <table> <alias> where <alias>.<field>...

别名必需在 delete之后出一次。

 

多表间删除语法:

 

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

 

Or:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

LEFT JOIN:

DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
### 解决MySQL DELETE语句报错的方法 当处理复杂的DELETE语句时,可能会遇到各种类型的错误。以下是针对不同情况的具体解决方案。 #### 使用子查询进行删除操作 对于涉及子查询的情况,可以采用创建临时的方式来规避潜在的问题。例如,在尝试通过IN子查询来删除记录时,如果直接嵌套SELECT会引发错误,则可以通过中间层的临时实现相同的功能[^2]: ```sql DELETE FROM evs_product WHERE evs_product_id IN ( SELECT pro_id FROM temp_ids ); -- 预先创建并填充temp_ids CREATE TEMPORARY TABLE IF NOT EXISTS temp_ids AS SELECT DISTINCT t.pro_id FROM evs_product t WHERE t.pro_code = 'DEC_MCK'; ``` 这种方法不仅能够绕过某些版本MySQL别名使用的限制,还能提高性能,因为临时可以在内存中快速访问。 #### 多关联删除 另一种常见场景是在多之间建立连接来进行批量删除。此时应避免直接给目标指定别名,而是利用JOIN语法完成跨操作。下面是一个不带别名的例子[^5]: ```sql DELETE o.* FROM `order` o INNER JOIN another_table at ON o.id = at.order_id WHERE some_condition; ``` 这里的关键在于移除了不必要的别名定义,并确保所有参与联接的字段都清晰指明所属格。 #### 数据类型兼容性检查 有时DELETE失败可能是由于数据类型不匹配引起的。比如字符串与数值之间的比较可能导致意外的结果或警告消息。务必确认所用条件达式的每一部分都能正确解析为目标列的数据类型[^3]。 假设存在一个包含混合字符范围值(如'21700-21800')作为过滤依据的情形,应该将其拆分为合适的区间界限再做判断: ```sql UPDATE table_name SET column=... WHERE CAST(SUBSTRING_INDEX(column, '-', 1) AS SIGNED) >= 21700 AND CAST(SUBSTRING_INDEX(column, '-', -1) AS SIGNED) <= 21800; ``` 此片段展示了如何安全地处理复合型编码串中的数字成分,从而防止因非法换而导致的操作中断。 #### 准备好预编译语句 为了增强安全性以及效率,特别是在应用程序频繁调用同一模式下的SQL命令时,考虑使用PREPARE语句构建动态查询结构[^4]。这有助于减少重复劳动的同时也降低了注入风险。 ```sql SET @stmt_text = CONCAT('DELETE FROM ', target_table, ' WHERE id=?'); PREPARE stmt FROM @stmt_text; EXECUTE stmt USING @id_value; DEALLOCATE PREPARE stmt; ``` 上述代码段说明了怎样组装带有参数占位符的DELETE指令并通过绑定实际变量值的方式执行之。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值