mysql中delete的表别名使用方法

解决MyBatis动态Delete语句问题

在 mapper.xml 中的 dynamicWhere 动态查询中使用了表别名,Delete 语句引用了动态查询,如下:

	<delete id="delete" parameterType="map">
    <![CDATA[
        delete from `physician` x 
    ]]>
		<include refid="dynamicWhere"/>
    </delete>
当输入删除条件后,得到的删除语句类似如下:

delete from `physician` x WHERE x.id = 12345
但这样的语句存在语法问题:

Error : 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 'x WHERE x.id = 12345' at line 1
通过查询资料发现,mysql的delete的语法有些特殊,如下:
delete x from `physician` x WHERE x.id = 12345
通过比较之后可以看出,delete 语句在用别名的时候要在delete后边多写一个别名。


<think> 我们参考了用户提供的引用内容,并需要回答关于MySQL DELETE语句的使用方法。 引用[1]介绍了DELETE语句的基本用法:可以删除整个表或满足条件的记录,还可以使用LIMIT限制删除数量,并提醒备份重要数据。 引用[2]展示了使用INNER JOIN子句进行删除的示例。 引用[3]指出删除表的所有数据可以使用不带WHERE子句的DELETE语句。 引用[4]提到DELETE语句中WHERE子句不能直接引用同一张表(会导致报错),需要通过别名或其他方式解决。 引用[5]比较了delete、drop和truncate的区别。 因此,我们将组织以下内容: 1. DELETE语句的基本语法 2. 删除特定条件的记录(使用WHERE子句) 3. 使用LIMIT限制删除数量 4. 使用JOIN进行删除(多表删除) 5. 删除表中的所有记录(注意与truncate的区别) 6. 注意事项(包括备份、事务、性能等) 7. 常见错误及解决方法(如引用[4]提到的错误) 同时,按照要求,在回答中适当添加引用标识,并在最后生成相关问题。 注意:由于用户提到“参考站内引用”,我们会在相关内容后添加引用标识,但用户提供的引用编号可能不连续(只有1,2,3,4,5),所以按实际引用的内容标注。 </think>### MySQL DELETE 语句使用指南 #### 一、基本语法与操作 1. **删除全部数据**(谨慎使用): ```sql DELETE FROM 表名; -- 清空整张表[^3] ``` 2. **条件删除**(最常用): ```sql DELETE FROM users WHERE id = 100; -- 删除特定ID记录[^1] ``` ```sql DELETE FROM orders WHERE status = 'cancelled' AND create_time < '2023-01-01'; -- 多条件删除[^1] 3. **限制删除数量**: ```sql DELETE FROM logs ORDER BY create_time ASC LIMIT 1000; -- 删除最早1000条记录[^1] ``` #### 二、高级删除技巧 1. **JOIN 删除**(多表关联删除): ```sql -- 删除主表关联数据 DELETE orders FROM orders JOIN customers ON orders.customer_id = customers.id WHERE customers.country = 'US'; -- 删除美国客户的订单[^2] ``` 2. **子查询删除**: ```sql DELETE FROM products WHERE category_id IN ( SELECT id FROM categories WHERE discontinued = 1 ); -- 删除已停用分类的商品[^4] ``` #### 三、关键注意事项 1. **事务安全**: ```sql START TRANSACTION; DELETE FROM temp_data; -- 可回滚操作[^5] ROLLBACK; -- 撤销删除 ``` 2. **避免自引用错误**: ```sql -- 错误写法(WHERE直接引用同表) DELETE FROM employees WHERE id IN (SELECT manager_id FROM employees); -- 正确写法(使用临时表/别名DELETE e1 FROM employees e1 JOIN employees e2 ON e1.id = e2.manager_id;[^4] ``` 3. **性能优化**: - 大表删除使用`LIMIT`分批操作 - 删除前先`SELECT`验证条件 - 对`WHERE`条件字段建立索引 #### 四、不同删除操作对比 | 操作 | 类型 | 可回滚 | 释放存储 | 速度 | |------------|--------|--------|----------|----------| | `DELETE` | DML | ✓ | ✗ | 慢 | | `TRUNCATE` | DDL | ✗ | ✓ | 快 | | `DROP` | DDL | ✗ | ✓ | 最快[^5] | > ⚠️ **重要安全建议**: > 1. 执行删除前务必备份数据:`mysqldump -u root -p dbname > backup.sql` > 2. 生产环境启用`--safe-updates`模式防止误删 > 3. 使用软删除模式(添加`is_deleted`标志)替代物理删除
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值