MYSQL INSERT语句是否会返回非1数值?JDBC场景下问题咨询
结论
存在JDBC执行该INSERT语句返回非1数值的合法场景,executeUpdate()的返回值为JDBC驱动统计的该语句执行影响的行数,非1返回的常见场景如下:
返回0的常见场景
- 显式/隐式启用了插入冲突忽略规则:如果SQL包含
INSERT IGNORE语法,或数据库、JDBC驱动配置了主键冲突不抛异常、静默丢弃冲突插入的规则,当插入的NAME已经在表中存在时,不会抛出SQL异常,会直接返回0,插入不生效。 - 分区表插入数据不匹配分区规则:如果CAT_TABLE为分区表,插入的字段值不符合分区规则,且数据库未开启严格SQL校验模式,会静默丢弃该条插入,返回0而不抛出异常。
- BEFORE INSERT触发器跳过插入:如果表上定义了BEFORE INSERT触发器,触发器逻辑中通过数据库支持的特殊语法终止当前行插入且未抛出SQL异常,也会返回0。
- 插入对象为可更新视图:如果操作的CAT_TABLE是可更新视图,且视图定义的
INSTEAD OF INSERT触发器逻辑跳过了插入操作,也会返回0。
返回大于1的常见场景
- 触发级联写入操作:如果CAT_TABLE定义了外键级联插入、插入时需要同步更新关联的物化视图、索引组织表等特殊结构,部分JDBC驱动会将级联操作产生的影响行数也计入返回结果,此时返回值会大于1。
- 驱动配置统计触发器影响行数:如果表上有AFTER INSERT触发器,且JDBC驱动开启了统计触发器执行DML的影响行数的配置,返回值会是主表插入行数+触发器影响的行数,大于1。
- 插入对象为可更新视图:如果操作的CAT_TABLE是可更新视图,且视图定义的
INSTEAD OF INSERT触发器执行了多条DML操作,返回值会是触发器执行DML的总影响行数,通常大于1。
你提供的示例为单值插入、无特殊配置的前提下,默认只会返回1,只有存在上述特殊配置、表结构、语法时才会出现非1返回值。
内容的提问来源于stack exchange,提问作者stackerstack
相关产品推荐
相关产品推荐

