【发布时间】:2016-03-09 03:23:09
【问题描述】:
有一个表 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一直在运行,无法完成。发生了什么?
【问题讨论】:
-
根据我的经验,从长远来看,最方便和最可靠的数据库总是会添加数据,很少或在少数地方,更新它,并且永远不会删除它(除了归档非常旧的数据)。存储很便宜,开发人员的理智和数据完整性/可追溯性更有价值。
标签: sql database oracle deadlock