你写的字符串连接是错的
String sql = "update users set password = password1 where xuehao ='”+ xuehao+“'";改成这样由于hive数仓的特性,不容许数据进行修改,造成hive中的数据更新活着删除很困难的问题,自hive
011版本之后,hive也尝试在测试环境允许进行update和delte *** 作,但这些 *** 作还不成熟,不敢在生产环境放心使用,其中也有一样不足。
create
table
test_temp
(
id
string,
name
string,
age
string
)
comment
'临时表'
partitioned
by
(y
string,m
string,d
string)
row
format
delimited
fieldsterminated
by','
stored
as
textfile
create
table
test
(
id
string,
name
string,
age
string
)
comment
'最终表'
row
format
delimited
fieldsterminated
by','
stored
as
orcfile
11
初始化
1通过hive数据load的方式先把数据加载到test_temp表中(此处也可以通过sqoop进行数据抽取,不再详述)。
load
data
local
inpath
'/home/hadoop/atxt'
overwrite
intotable
test_temp
2通过hive
insert
overwrite的方式把临时表的数据加载到最终表test中。
insertintotable
test
select
id,name,age
from
test_temp我试过update t A set r2=(select r2 from t B where Br2=Ar2) where r2=3 这样说有语法错误
这句话是错的
应该是这样:
update t set r2=(select r2 from t B,T A where Br2=Ar2)
where r2=3
但是我不明白你的意思Br2=Ar2??什么意思??
你HI我把分类: 电脑/网络 >> 软件
问题描述:
我在ms-sql中有db-a库(有表aaa),db-b库(有表bbb),db-c库(有表ccc)
表aaa表bbb表ccc中都有id字段,三表中另外分别有(aaa,bbb,ccc)3个字段值要根据id保持一致,
当db-a库(有表aaa)的aaa字段中有一个记录修改能自动触发修改另两个库中表bbb表ccc中对应字段bbb,ccc值
===================================下面例子我看不懂
CREATE trigger [数据库Atr_user] on [user]
for update,insert,delete
as
alter table 数据库B[user] DISABLE TRIGGER [数据库Btr_user]
-----------------------------------
if not exists (select from deleted) --插入
insert 数据库B[user](username,userpass,landtime) select username,password,lastlogin from inserted
else if not exists (select from inserted)--删除
delete 数据库B[user] where id in (select userid from deleted)
else--更新
update [user]
set
[user]username=iusername,
[user]userpass=ipassword
from 数据库B[user] as [user],
inserted as i
where [user]id=iuserid
alter table 数据库B[user] ENABLE TRIGGER [数据库Btr_user]
解析:
什么地方不懂
1 不懂触发器原理以及工作过程
2 不懂那个例子
不懂原理跟过程的话baidu一下会有很多,随便一本将数据库的书都会提到,不再赘述这个例子可能是有点长,我给你翻译一下吧
==================================
CREATE trigger [数据库Atr_user] on [user]
/ 建立触发器的基本语法 在数据库A的user表建立一个名字tr_user的触发器 /
for update,insert,delete
/监视 修改 插入 删除/
as
alter table 数据库B[user] DISABLE TRIGGER [数据库Btr_user]
/ 修改这个表的时候就不要做触发了,disable掉 /
-----------------------------------
if not exists (select from deleted) --插入
/ 如果deleted表为空,那么 /
insert 数据库B[user](username,userpass,landtime) select username,password,lastlogin from inserted
/ 将inserted表(就是对于触发器来说刚刚 入的 )插入到Buser /
else if not exists (select from inserted)--删除
/ 否则 如果 inserted 为空 /
delete 数据库B[user] where id in (select userid from deleted)
/ 那么删除Buser下id是deleted 中出现的id 这里用了in /
else--更新
update [user]
set
[user]username=iusername,
[user]userpass=ipassword
from 数据库B[user] as [user],
inserted as i
where [user]id=iuserid
/ update就很明显了,凡是updated的都来更新,保持一样就可以了 /
alter table 数据库B[user] ENABLE TRIGGER [数据库Btr_user]
这里用了一个技巧,根据inserted 以及deleted 来判断当前是插入或者删除,然后如果是插入的,那么另一个表删除,删除的另一个表插入更新最简单(可能是用来两个表互相交换数据,跟你的目的不一样)
如果你觉得难以理解,单独来创建三个触发器, insert delete update也行,这样就能减少一些判断比如insert
你可以先删除 bbb ccc里面id in inserted的(为了防止重复),然后再全部insert进去
不知道你为什么要这么做,感觉意义不大明显的冗余啊如果是想保留数据,那么定期添加一个计划任务来用数据传输服务多好 再说备份也是很好用的
希望我理解没有错误
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)