MYSQL数据库触发器的插入限制[急]

0轰隆隆0 2010-10-13 11:20:56
表A 里面有两个字段:ID,UserID

现在要求写一个触发器,在插入记录的时候进行判断,如果插入数据UserID的值存在并且大于5条的时候返回,不执行插入操作

比如将UserID是0002的记录插入表中,这时表中UserID等于0002的记录已经大于5条了,那么这次操作就不会被执行!

这个触发器该怎么写呢?

【写出触发器,并且是最优的给分60】

表B里面有三个字段:ID,AddTime,click

AddTime类型为DATETIME ,click为BIGINT

求一SQL语句,要求按月分组求click的和,如5月份的点击之和,6月的点击之和等等!

【写出SQL语句,给分20】
...全文
882 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
0轰隆隆0 2010-10-13
  • 打赏
  • 举报
回复
mysql:


create trigger update_exceed BEFORE INSERT on A
for each row
begin
select count(*) into @ee from A where UserID=new.UserID;
if @ee>=5 then
insert into A(id) values(0);
end if;
end



触发器书写成功,谢谢WWWWA和zuoxingyu的帮助,我在此将代码贴出和大家分享,如果代码有什么不妥处也请大家指正!
zuoxingyu 2010-10-13
  • 打赏
  • 举报
回复
select left(AddTime,8),sum(CAST(click AS int)) from tt group by left(AddTime,8)
0轰隆隆0 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zuoxingyu 的回复:]
select month(AddTime),sum(CAST(click AS int)) from tt group by month(AddTime)

这样转换后,看看。
[/Quote]

执行成功

新的问题又来了,没有办法区分年份呀,比如它把06年5月份的和07年5月份的统计在一起了
ACMAIN_CHM 2010-10-13
  • 打赏
  • 举报
回复
表B里面有三个字段:ID,AddTime,click

AddTime类型为DATETIME ,click为BIGINT

求一SQL语句,要求按月分组求click的和,如5月份的点击之和,6月的点击之和等等!


select month(AddTime),sum(click)
from 表B
group by month(AddTime)
ACMAIN_CHM 2010-10-13
  • 打赏
  • 举报
回复
写入记录的条数限制可以通过触发器实现。语句并不复杂。中断操作的方法参考下如下。

MySQL 中如何在触发器里中断记录的插入或更新?
http://blog.csdn.net/ACMAIN_CHM/archive/2009/07/25/4380183.aspx
zuoxingyu 2010-10-13
  • 打赏
  • 举报
回复
select month(AddTime),sum(CAST(click AS int)) from tt group by month(AddTime)

这样转换后,看看。
0轰隆隆0 2010-10-13
  • 打赏
  • 举报
回复
触发器是MYSQL的,第二个问题是SQL Server的
0轰隆隆0 2010-10-13
  • 打赏
  • 举报
回复
晕噶,忘了这个是SQL Server2000数据库,又弄混了,崩溃中...
0轰隆隆0 2010-10-13
  • 打赏
  • 举报
回复
执行

select month(AddTime),sum(click) from tt group by month(AddTime)

click的类型为varchar时

返回错误信息是

服务器: 消息 409,级别 16,状态 2,行 1
sum or average aggregate 运算不能以 varchar 数据类型作为参数。
zuoxingyu 2010-10-13
  • 打赏
  • 举报
回复

mysql> select '1'+'2';
+---------+
| '1'+'2' |
+---------+
| 3 |
+---------+
1 row in set (0.00 sec)

mysql>


一样的运行,会隐式转换的。
0轰隆隆0 2010-10-13
  • 打赏
  • 举报
回复
明白

谢谢二位!

在第二的问题里面 如果 click的类型为varchar,但保存的却是数字,又改怎么处理呢
WWWWA 2010-10-13
  • 打赏
  • 举报
回复
MYSQL没有TRIGGER回滚,只有出错,比如插入1个已经存在的USERID
zuoxingyu 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wwwwa 的回复:]
UserID是否是主键?UserID有什么约束
select count(*) into @ee from tt where UserID=new.UserID
if @ee>=5 then
可以设置1个报错的语句,比如主键重复
endif
[/Quote]

我贴的拦截的原理和斑竹的一样,也是引出来一个错误。
0轰隆隆0 2010-10-13
  • 打赏
  • 举报
回复
UserID是主键,并且不会重复

怎么设置报错语句呢,谢谢大侠WWWWA,可否详细
zuoxingyu 2010-10-13
  • 打赏
  • 举报
回复
1:
http://blog.chinaunix.net/u3/116107/showart.php?id=2326234

这里详细说明了怎么样用触发器拦截数据操作。

2:
select month(AddTime),sum(click) from tt group by month(AddTime)
WWWWA 2010-10-13
  • 打赏
  • 举报
回复
UserID是否是主键?UserID有什么约束
select count(*) into @ee from tt where UserID=new.UserID
if @ee>=5 then
可以设置1个报错的语句,比如主键重复
endif
WWWWA 2010-10-13
  • 打赏
  • 举报
回复
select month(AddTime),sum(click) from tt group by month(AddTime)
0轰隆隆0 2010-10-13
  • 打赏
  • 举报
回复

select month(AddTime) as month,sum(cast(click as int)) as sum from tt where datepart(yy,AddTime)=2010 group by month(AddTime)

select top 20 year(AddTime) as year,sum(cast(click as int)) as sum from tt group by year(AddTime)

56,682

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧