是否应该插入或更新新数据?当我尝试在表行中插入null时,为什么它会死锁?

时间:2016-03-09 03:23:10

标签: sql database oracle deadlock

有一个表user_info。

 CREATE TABLE USER_INFO 
   (USER_ID VARCHAR2(50 BYTE) PRIMARY KEY, 
    USER_NAME VARCHAR2(50 BYTE),
    USER_ROLE_TYPE VARCHAR2(50 BYTE)
   )

扩展api和admin(其user_role_type为admin),创建了对表的新表引用。

 CREATE TABLE ADMIN_INFO 
   (USER_ID VARCHAR2(50 BYTE), 
    USER_PHONE VARCHAR2(50 BYTE),
    USER_EMAIL VARCHAR2(100 BYTE)
   )

,新表引用带外键的USER_INFO。

ALTER TABLE ADMIN_INFO 
ADD CONSTRAINT FK_ADMIN_INFO
FOREIGN KEY (USER_ID) REFERENCES USER_INFO(USER_ID) ON DELETE CASCADE;

并且USER_INFO已经将一些数据插入到USER_INFO中,并且它存在一行user_id ='123'。

现在我只想更改 USER_PHONE, 所以我写了sql:

update ADMIN_INFO set
        USER_PHONE = '17096022212'
        where USER_ID = '123'

但是当我尝试从新表中选择user_id ='123'的行时,仍然没有。

为什么?

我确实希望将新信息保存到它,它是一个edit-api,它会显示并可以保存页面中的数据,我是如何制作的?

如果我想给它一个if-else判断,对于这两种情况和sql不同。例如

if( the row exists){ update it }else{insert }

我可以在mapper.xml中使用sql吗?如果可以的话,我是如何编写sql的?

------------------- 2016年3月10日/ ----------------------

现在我完成了一个测试确定的SQL

        merge into ADMIN_INFO d
        using(select '123' as USER_ID,
              '1234567' as USER_PHONE from dual) dd
        on(d.USER_ID = dd.USER_ID)
        when matched then
            update set d.USER_PHONE = dd.USER_PHONE
        when not matched then
            insert (USER_ID,USER_PHONE)
        values(dd.USER_ID,dd.DRIVER_NUMBER)

但是,当我尝试这样测试时:

        merge into ADMIN_INFO d
        using(select '1234' as USER_ID,
              __null__ as USER_PHONE from dual) dd
        on(d.USER_ID = dd.USER_ID)
        when matched then
            update set d.USER_PHONE = dd.USER_PHONE
        when not matched then
            insert (USER_ID,USER_PHONE)
        values(dd.USER_ID,dd.DRIVER_NUMBER)

数据库显示错误,死锁,sql一直在运行,无法完成。发生了什么事?

2 个答案:

答案 0 :(得分:1)

UPDATE用于更改该特定表中已存在的行 - 因此,如果ADMIN_INFO表(您尝试更新的那个)中没有USER_ID的行,则需要先将其插入

答案 1 :(得分:0)

更新sql的结果是什么?在我看来admin_info表中没有这样的记录。如果要将新记录插入表中,则应使用insert而不是update。