违法完整约束条件(PMIS.FK_12157)-已找到子记录日志)的解决

本文分享了解决数据库中删除表数据时遇到的外键约束问题的经验,通过更改外键名称及仔细检查关联表的方式最终解决了问题。

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

 

    

今天删除一个表中数据的时候,出现了这个问题――违法完整约束条件(PMIS.FK_12157-已找到子记录日志),不知道为何,自己首先想到的是查找跟这个表关联的表的一些配置,没有问题。都是级联删除的,第二次删除,还是同样的――违法完整约束条件(PMIS.FK_12157-已找到子记录日志)。这下有点怀疑了,难道不能级联删除?我又写了一次语句,先删除关联表的内容。继续操作――违法完整约束条件(PMIS.FK_12157-已找到子记录日志),无语,还是去找下这个FK吧,查看这个外键的表的所有字段,跟这个表一点关系没有。直接晕倒。按以前的习惯,改名字吧。果然。―――改名之后一切解决。直接不知道说什么了。

 

当然,其中的原理自己也想了下。可能是其相关联的某些相关记录也好,相关配置也好。都没有被清除干净。可能这里改名之后可以,如果下次这个表再次操作的时候,可能又会出现另外的。只是暂时没有发现,而且继续测试了下,发现没有问题。

 

以为这样问题就解决了,其实不然,原来自己的测试还做的不够,原来还有问题,哈哈,终于自己也发现了,原来是还有表跟这个有关联,---虽然这个表跟他没有关系,修改了这个表的外键名称可以,但是话说回来,还有相关的地方没有得到解决.因为它相关的另外的表跟这个表有关系,所以检查一定要仔细啊.

 

希望到此已经解决.还等以后继续测试.查看所有与此表的关系表――查看出现此问题的表,以及关系表.跟操作表的关系,以及配置上,就会发现问题.――解决。

 

### 问题分析 在MySQL 5.7.5及以上版本中,默认启用了`sql_mode=only_full_group_by`模式。在这种模式下,如果SQL查询中的`SELECT`列表包含未聚合的列,并且这些列没有出现在`GROUP BY`句中,则会导致语法错误[^4]。具体表现为`java.sql.SQLSyntaxErrorException`异常,提示`Expression #X of SELECT list is not in GROUP BY clause and contains nonaggregated column`。 此问题的根本原因是MySQL严格要求分组查询时,`SELECT`列表中的所有非聚合列必须出现在`GROUP BY`句中,否则无法保证查询结果的确定性[^3]。 --- ### 解决方案 #### 方法一:修改SQL语句 可以通过调整SQL语句,确保`SELECT`列表中的所有非聚合列都包含在`GROUP BY`句中。例如: ```sql SELECT bt.table_name, btv.version FROM biz_table bt LEFT JOIN biz_table_ver btv ON bt.table_id = btv.table_id WHERE bt.system_up = 1 GROUP BY bt.table_name, btv.version; ``` 上述SQL语句将`btv.version`添加到`GROUP BY`句中,从而满足`sql_mode=only_full_group_by`的要求[^5]。 #### 方法二:禁用`only_full_group_by`模式 可以通过修改MySQL的`sql_mode`来禁用`only_full_group_by`模式。以下是具体步骤: 1. **临时禁用(重启后失效)**: 执行以下SQL命令以临时禁用`only_full_group_by`模式: ```sql SET @@global.sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; ``` 2. **永久禁用**: 编辑MySQL配置文件`my.cnf`(或`my.ini`),找到`[mysqld]`部分并修改`sql_mode`参数。例如: ```ini [mysqld] sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' ``` 保存文件后重启MySQL服务以使更改生效。 #### 方法三:使用聚合函数 如果某些列不需要出现在`GROUP BY`句中,可以将其包装在聚合函数中,例如`MIN()`、`MAX()`等。例如: ```sql SELECT bt.table_name, MAX(btv.version) AS max_version FROM biz_table bt LEFT JOIN biz_table_ver btv ON bt.table_id = btv.table_id WHERE bt.system_up = 1 GROUP BY bt.table_name; ``` 上述SQL语句通过`MAX()`函数对`btv.version`进行聚合,从而避免了将其添加到`GROUP BY`句中[^1]。 --- ### 注意事项 - 修改`sql_mode`可能会影响数据库的行为,需谨慎操作。 - 推荐优先调整SQL语句以符合`sql_mode=only_full_group_by`的要求,而不是直接禁用该模式。 - 如果涉及复杂的业务逻辑,建议与数据库管理员沟通后再决定最佳解决方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值