mysql 多表删除陷阱(跨库schema+别名的语法错误问题)

本文探讨了在MySQL中跨库使用schema执行多表删除时的限制,特别是关于表别名的问题。通过示例展示了跨库删除操作的正确语法,并指出MySQL在该场景下不允许为表赋予别名。

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

* 登陆用户为demo

* 连接字符串串中指定默认库是demo

* 另一个数据库(schema)是demo2,demo用户拥有demo2的所有访问权限

 

delete f,s from tableF f left join tableS s on f.fid=s.fid

- result=ok

 

delete f,s from demo.tableF f left join demo.tableS s on f.fid=s.fid

- result=ok

 

delete f,s from demo2.tableF f left join demo2.tableS s on f.fid=s.fid

- result=error,bad sql grammar :(

 

delete demo2.tableF,demo2.tableS from demo2.tableF left join demo2.tableS on demo2.tableF.fid=demo2.tableS.fid

- result=ok


可见,mysql在跨库使用schema来执行多表删除时不能给表取别名。
<think>嗯,我现在要回答用户关于MySQL和Oracle语法差异的问题。首先,我需要回想一下自己对这两个数据的了解,然后整理出主要的区别点。可能包括数据类型、分页查询、字符串处理、事务处理、自增字段、日期函数、存储过程、权限管理等方面。 数据类型方面,我记得Oracle有NUMBER、VARCHAR2这些类型,而MySQL用INT、VARCHAR。自增字段的实现方式不同,MySQL用AUTO_INCREMENT,而Oracle用序列和触发器。分页查询的话,MySQL是LIMIT,Oracle用ROWNUM或者ROW_NUMBER()。日期函数可能也有差异,比如MySQL的NOW()和Oracle的SYSDATE。 字符串拼接方面,MySQL用CONCAT函数,Oracle可以用||或者CONCAT,但CONCAT只能两个参数。事务处理上,Oracle默认不会自动提交,而MySQL的InnoDB引擎在自动提交设置上可能不同。存储过程和函数,两者语法差异较大,比如变量声明和循环结构。权限管理部分,Oracle有更复杂的角色和权限体系,而MySQL相对简单。 需要确保每个点都准确,可能得查证一些细节,比如Oracle的分页查询在12c之后是否有新的方法,比如FETCH NEXT。还有数据类型的具体差异,比如Oracle的DATE类型包含时间,而MySQL的DATE只有日期,时间部分用DATETIME或TIMESTAMP。 另外,系统级指令要求数学公式用$...$,但这个问题可能不太涉及数学公式,不过如果有示例中的达式,比如分页计算可能需要公式,但可能不需要。要确保回答结构清晰,分点列出,用中文,语法正确。用户需要的是逐步解决问题,所以可能需要分大类,每个大类下有小点,比如基本语法、数据类型、事务处理等。 可能还需要提到SQL语句的细微差别,比如Oracle的FROM DUAL,而MySQL可以省略。还有别名引用、引号处理、约束和索引的语法差异。比如外键约束在MySQL的存储引擎支持情况,而Oracle可能更统一。 需要避免错误,比如在分页查询中,Oracle传统方法使用子查询和ROWNUM,而12c之后可以用OFFSET-FETCH。MySQL的LIMIT后面可以跟两个参数,偏移和数量。字符串处理中,Oracle的字符串比较是否区分大小写,而MySQL的校对规则影响这个行为。 事务的隔离级别可能两者都支持,但默认设置可能不同。存储过程和触发器的编写方式,比如Oracle使用PL/SQL,MySQL使用自己的存储过程语法,可能更接近标准SQL但功能较弱。 还有函数方面的差异,比如日期加减,Oracle用INTERVAL,而MySQL用DATE_ADD。聚合函数如处理空值的方式可能不同。此外,Oracle的MERGE语句更强大,而MySQL在较新版本才支持类似功能。 权限管理方面,Oracle的用户和模式关系紧密,而MySQL的用户和数据关联,权限授予语句也有所不同。比如Oracle的GRANT可以赋予复杂的系统权限,而MySQL的权限可能更基于数据级别。 总之,需要将这些差异分门别类,用清晰的结构呈现,帮助用户逐步理解两者的主要区别。同时注意使用中文,避免技术术语混淆,必要时给出示例代码,但根据用户要求,可能不需要过的代码细节,而是总结性的对比。</think>MySQL与Oracle在语法上的主要差异可分为以下类别,以下是逐步对比分析: --- ### 一、基础语法差异 1. **分页查询** - **MySQL**: 使用 `LIMIT` 子句: ```sql SELECT * FROM table LIMIT 10 OFFSET 20; -- 跳过20行取10条 ``` - **Oracle**: - 传统写法(12c之前): ```sql SELECT * FROM ( SELECT t.*, ROWNUM rn FROM ( SELECT * FROM table ORDER BY id ) t WHERE ROWNUM <= 30 ) WHERE rn > 20; ``` - 12c+ 支持 `FETCH`: ```sql SELECT * FROM table ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY; ``` 2. **字符串拼接** - **MySQL**: 使用 `CONCAT()` 函数(支持个参数): ```sql SELECT CONCAT(first_name, ' ', last_name) FROM users; ``` - **Oracle**: 支持 `||` 运算符或 `CONCAT()`(仅支持2个参数): ```sql SELECT first_name || ' ' || last_name FROM users; ``` --- ### 二、数据类型差异 | **特性** | **MySQL** | **Oracle** | |----------------|------------------------------------|-------------------------------------| | **整数类型** | `INT`, `TINYINT`, `BIGINT` | `NUMBER`(如`NUMBER(10)`示整数) | | **小数类型** | `DECIMAL`, `FLOAT` | `NUMBER`(如`NUMBER(10,2)`) | | **日期时间** | `DATE`(日期+时间), `TIMESTAMP` | `DATE`(日期+时间), `TIMESTAMP` | | **布尔值** | `BOOLEAN`(实际存储为TINYINT) | 无原生布尔类型,用`NUMBER(1)`替代 | --- ### 三、自增字段实现 - **MySQL**: 使用 `AUTO_INCREMENT` 关键字: ```sql CREATE TABLE t ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) ); ``` - **Oracle**: 依赖**序列(Sequence)** + **触发器(Trigger)**: ```sql CREATE SEQUENCE seq_t_id START WITH 1 INCREMENT BY 1; CREATE TRIGGER trg_t BEFORE INSERT ON t FOR EACH ROW BEGIN SELECT seq_t_id.NEXTVAL INTO :new.id FROM dual; END; ``` --- ### 四、日期与时间函数 | **操作** | **MySQL** | **Oracle** | |-------------------|------------------------------|---------------------------------| | **当前时间** | `NOW()` | `SYSDATE` | | **日期格式化** | `DATE_FORMAT(date, '%Y-%m')` | `TO_CHAR(date, 'YYYY-MM')` | | **日期加减** | `DATE_ADD(date, INTERVAL 1 DAY)` | `date + INTERVAL '1' DAY` | | **提取年份** | `YEAR(date)` | `EXTRACT(YEAR FROM date)` | --- ### 五、事务与锁机制 1. **事务提交** - **MySQL**(InnoDB引擎): 默认启用自动提交(`autocommit=1`),需显式使用 `BEGIN` 或 `START TRANSACTION`。 - **Oracle**: 默认手动提交,执行DML后需 `COMMIT` 生效。 2. **锁机制** - **MySQL**: 支持行级锁(InnoDB),但锁定行为较简单。 - **Oracle**: 提供更细粒度的锁(如行级锁、级锁),支持 `SELECT ... FOR UPDATE SKIP LOCKED` 跳过锁定行。 --- ### 六、存储过程与函数 1. **存储过程示例** - **MySQL**: ```sql DELIMITER $$ CREATE PROCEDURE get_user(IN uid INT) BEGIN SELECT * FROM users WHERE id = uid; END $$ DELIMITER ; ``` - **Oracle**: ```sql CREATE PROCEDURE get_user (uid IN NUMBER) AS BEGIN SELECT * FROM users WHERE id = uid; END; ``` 2. **语法差异** - Oracle 使用 `PL/SQL`(支持包、游标等高级特性),MySQL 语法更接近标准 SQL。 --- ### 七、权限管理 - **MySQL**: 权限与数据绑定: ```sql GRANT SELECT ON db.table TO 'user'@'host'; ``` - **Oracle**: 权限与角色(Role)关联,支持系统级权限(如 `CREATE TABLE`): ```sql GRANT CREATE SESSION TO user; GRANT SELECT ON schema.table TO user; ``` --- ### 八、其他差异 1. **空值判断** - **MySQL**: `IFNULL(expr, default)` - **Oracle**: `NVL(expr, default)` 2. **伪** - **Oracle** 查询需 `FROM DUAL`: ```sql SELECT 1+1 FROM dual; ``` - **MySQL** 可直接执行: ```sql SELECT 1+1; ``` --- ### 总结 | **维度** | **MySQL** | **Oracle** | |----------------|------------------------------------|-------------------------------------| | **适用场景** | 中小型应用、Web项目 | 大型企业级应用、复杂事务处理 | | **成本** | 开源免费(社区版) | 商业授权费用高 | | **功能扩展** | 功能较简单 | 支持高级特性(如分区、物化视图) | 根据业务需求选择合适的数据,小型项目可优先考虑MySQL,复杂场景(如金融系统)建议使用Oracle。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值