字段值自动加1

[复制链接]
查看11 | 回复8 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
create table login_user(
userpk NUMBER(20) not null,
username VARCHAR2(20) not null,
password VARCHAR2(20) not null,
lastlogindatedate not null ,
login_number NUMBER(20) not null
);

insert into login_user values(20050304442474,'liyqi','1234',to_date('2008-1-28','yyyy-mm-dd'),0);

insert into login_user values(20050304442475,'yurengl','1234',to_date('2008-1-28','yyyy-mm-dd'),0);
insert into login_user values(20050304442476,'renyli','1234',to_date('2008-1-28','yyyy-mm-dd'),0);
insert into login_user values(20050304442477,'zhuangww','1234',to_date('2008-1-28','yyyy-mm-dd'),0);
insert into login_user values(20050304442478,'yangsj','1234',to_date('2008-1-28','yyyy-mm-dd'),0);
insert into login_user values(20050304442479,'wangrh','1234',to_date('2008-1-28','yyyy-mm-dd'),0);
insert into login_user values(20050304442480,'wuzh','1234',to_date('2008-1-28','yyyy-mm-dd'),0);
commit;

SQL> select * from login_user;
USERPK USERNAME
PASSWORDLASTLOGINDATE LOGIN_NUMBER
---------- -------------------- -------------------- -------------- ----------------------------------
2.0050E+13 liyqi
1234
28-1月 -08
0
2.0050E+13 yurengl
1234
28-1月 -08
0
2.0050E+13 renyli
1234
28-1月 -08
0
2.0050E+13 zhuangww
1234
28-1月 -08
0
2.0050E+13 yangsj
1234
28-1月 -08
0
2.0050E+13 wangrh
1234
28-1月 -08
0
2.0050E+13 wuzh
1234
28-1月 -08
0
已选择7行。
问题:
LASTLOGINDATE 字段标识用户最后一次登录的时间,由前台程序更新,
LOGIN_NUMBER 是新加的列,要实现用户登录一次(也就是说某行数据的 LASTLOGINDATE字段被更新时),LOGIN_NUMBER的值就自动加1
如何实现
[ 本帖最后由 gaiwei666 于 2008-4-8 17:28 编辑 ]
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
触发器
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
用触发器了
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
用trigger吧
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
无非两种方式,
1. 在前台程序中实现, 更新LASTLOGINDATE 字段时同时把那个字段的值加1
update login_user
set lastlogindate=sysdate,

login_number=login_number+1
where username=:1
/
2. 用trigger实现.
推荐使用1的方式, 因为trigger会拖累表的, 而且trigger不如前台程序那么好管理. 经常会出现前台程序开发人员不知道trigger的存在, 而开发重复的逻辑, 严重的会造成数据库死锁.
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
原帖由 mihawk 于 2008-4-9 09:33 发表
无非两种方式,
1. 在前台程序中实现, 更新LASTLOGINDATE 字段时同时把那个字段的值加1
update login_user
set lastlogindate=sysdate,
login_number=login_number+1
where username=:1
/
2. 用trigger实现.
推荐使用1的方式, 因为trigger会拖累表的, 而且trigger不如前台程序那么好管理. 经常会出现前台程序开发人员不知道trigger的存在, 而开发重复的逻辑, 严重的会造成数据库死锁.


有道理
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
原帖由 mihawk 于 2008-4-9 09:33 发表
无非两种方式,
1. 在前台程序中实现, 更新LASTLOGINDATE 字段时同时把那个字段的值加1
update login_user
set lastlogindate=sysdate,

login_number=login_number+1
where username=:1
/
2. 用trigger实现.
推荐使用1的方式, 因为trigger会拖累表的, 而且trigger不如前台程序那么好管理. 经常会出现前台程序开发人员不知道trigger的存在, 而开发重复的逻辑, 严重的会造成数据库死锁.





回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
LOGIN_NUMBER 是新加的列,要实现用户登录一次(也就是说某行数据的 LASTLOGINDATE字段被更新时),LOGIN_NUMBER的值就自动加1
是后提出的需求,如果不能改程序,看来只能用触发器了

trigger实现的代码如下,不知还有没有其它的写法
create or replace trigger login_user_LASTLOGINDATE
beforeupdate
of LASTLOGINDATE
on login_user
referencing old as old_value

new as new_value
for each row
begin
:new_value.login_number :=

ld_value.login_number+1;
end;
[ 本帖最后由 gaiwei666 于 2008-4-9 10:26 编辑 ]
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行