小羚羊网站怎么建设,通州网站开发,国内最新军事新闻最新消息,房产部门成立网站在使用达梦数据库管理工具时#xff0c;我们测试过程中时常需要更新表数据#xff0c;有时为了便捷#xff0c;会直接使用管理工具修改表数据的值#xff0c;但偶尔会遇到“结果集不可更新#xff0c;请确认查询列是否出自同一张表#xff0c;并且包含值唯一的列。”的报…在使用达梦数据库管理工具时我们测试过程中时常需要更新表数据有时为了便捷会直接使用管理工具修改表数据的值但偶尔会遇到“结果集不可更新请确认查询列是否出自同一张表并且包含值唯一的列。”的报错那么这究竟是怎么回事呢。 一、问题复现
1.创建一张测试表并插入数据 2.使用SQL查询该表数据 3.修改表数据
在修改表数据的过程中出现了报错
正常情况下点击查询结果集这里的“小锁”图标即可修改数据 但这里点击时弹出了报错窗口报错信息为“结果集不可更新请确认查询列是否出自同一张表并且包含值唯一的列。” 二、问题分析
根据我们的操作可以确认查询结果集就是出自同一张表。如果查询结果集确实不是出自同一张表即实际并非本文中的操作方式而是几张表关联查询那一定是不可以用这种方式更新表数据的。
所以根据其报错提示该问题主要是由于该表查询的列不唯一也就是说表中不存在主键、唯一约束、唯一索引无法确定数据唯一性。
进一步排查在我们操作管理工具执行更新操作前打开数据库SQL日志看看操作管理工具数据库具体执行了什么操作呢
通过抓取管理工具操作的SQL查询SQL日志发现日志中有这样一段SQL 格式化该SQL简单分析下可以得知该条SQL语句其实就是看查询的结果集对应的表上是不是有唯一索引达梦创建唯一键时会自动创建一条由系统内部维护的唯一索引且唯一索引在哪些列上。
执行一下该条SQL该语句对应的参数分别是模式名和表名根据SQL日志中的PARAMS参数提示确认两个参数实际为模式名SYSDBA和表名TEST 实际的查询结果为空。 那么如果在C1列上创建唯一索引效果会如何呢 创建唯一索引的方法有很多可以创建主键唯一约束唯一索引创建主键和唯一约束时数据库内部都会创建一个由数据库内部自己维护的唯一索引。 这里创建主键试试
ALTER TABLE SYSDBA.TEST ADD PRIMARY KEY(C1); 主键创建完毕再次执行SQL日志中的那条查询语句此时已经有结果集了查询结果显示在SYSDBA模式下的TEST表中C1列上创建了一个升序排列的唯一索引索引名为INDEX33649530该索引由数据库系统自动创建内部自己维护用户不可主动删除删除时会报错“试图删除系统索引”。当然如果创建唯一约束和唯一索引效果是一样的区别在于如果创建的是唯一索引这里查询结果显示的就是我们自定义的唯一索引名字了。 此时再去用管理工具执行修改数据的操作则不会再报错可以提交并修改成功 再次查询数据确认已修改 三、注意事项
需要注意
1.如果在执行SQL查询时查询结果集中的列必须全部包含创建唯一索引时对应的列否则则会报错。
如下图中只有SQL1SQL4SQL6SQL7可以更新表数据即查询结果集必须包含C1列 而下图中只有SQL6SQL7可以更新表数据即查询结果集必须包含C1,C3列 四、解决方法
解决该问题有以下三种方法可供参考
1添加主键约束
ALTER TABLE SYSDBA.TEST ADD CONSTRAINT PK_TEST_C1 PRIMARY KEY(C1);
或
ALTER TABLE SYSDBA.TEST ADD PRIMARY KEY(C1);
2添加唯一约束
ALTER TABLE SYSDBA.TEST ADD CONSTRAINT CONS_UNI_TEST_C1 UNIQUE(C1);
3创建唯一索引
CREATE UNIQUE INDEX UIDX_TEST_C1 ON SYSDBA.TABLE1(C1);