oracle的ora 01407,ORA-01407: cannot update to null 错误解决

在更新客户数据时 出现ORA-01407错误

SQL> select table_id,game_deal_log_id from tb_test_log;

TABLE_ID   GAME_DEAL_LOG_ID

---------- ----------------

G                         0

10001               4923601

AA                  4923676

BB                  4923672

CC                  4923677

DD                  4923674

FF                  4923673

GG                  4923671

HH                  2616668

II                  4923668

C                         0

D                         0

E                         0

F                         0

14 rows selected

sele

SQL> select * from test;

GAME_DEAL_LOG_ID TABLE_ID

---------------- ----------

4661667 10001

4661556 AA

4661558 BB

4661559 CC

4661553 DD

4661552 FF

4661555 GG

2616668 HH

4661557 II

9 rows selected

SQL>

SQL> update tb_test_log a

2     set game_deal_log_id = (select game_deal_log_id

3                       from test b

4                      where a.table_id = b.table_id);

update tb_adjustment_handledeal_log a

set game_deal_log_id = (select game_deal_log_id

from test b

where a.table_id = b.table_id)

ORA-01407: cannot update ("TEST"."TB_TEST_LOG"."GAME_DEAL_LOG_ID") to NULL

这是因为上面sql运行时 会更新所有game_deal_log_id字段 下面我删除不相等的table_id

SQL> delete from tb_test_log where table_id in ('C','D','E','F','G');

5 rows deleted

SQL>

SQL> update tb_test_log a

2     set game_deal_log_id = (select game_deal_log_id

3                       from test b

4                      where a.table_id = b.table_id);

9 rows updated

更新成功     这个sql就只能保证两边数据记录一致 才能更新成功

SQL> select table_id,game_deal_log_id from tb_test_log;

TABLE_ID   GAME_DEAL_LOG_ID

---------- ----------------

10001               4661667

AA                  4661556

BB                  4661558

CC                  4661559

DD                  4661553

FF                  4661552

GG                  4661555

HH                  2616668

II                  4661557

9 rows selected

SQL> rollback;

Rollback complete

SQL>

所以上面sql还是写的有问题,没有真正关联到相等的table_id,采取如下写法就是正确的写法

SQL> update tb_test_log a

2     set game_deal_log_id = (select game_deal_log_id

3                       from test b

4                      where a.table_id = b.table_id)

5  where  exists (select 1 from test b where a.table_id=b.table_id);

9 rows updated

SQL> select table_id,game_deal_log_id from tb_test_log;

TABLE_ID   GAME_DEAL_LOG_ID

---------- ----------------

G                         0

10001               4661667

AA                  4661556

BB                  4661558

CC                  4661559

DD                  4661553

FF                  4661552

GG                  4661555

HH                  2616668

II                  4661557

C                         0

D                         0

E                         0

F                         0

14 rows selected

SQL>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值