check约束时间的问题

babynotooth 2015-12-18 01:28:31

图中times为自增列,items和jmg为联合主键,请问如何创建约束实现以下问题
问题1:
要求times会根据jmg列自增,图中的567 应该为123
如果再插一列jmg为111111的那么times列就为5
如果再插入一列jmg为333333的,那么times为1
如果再插入一列jmg为444444的,那么times为1
如果再插入一列jmg为333333的,那么times为2

问题2:
如果上面问题解决
我想在插入新数据时,jmg列相同时,times是自增的,inq_date的时间也只能越来越大
jmg列不同时,inq_date的时间可以不分大小
就比如图中123列的inq_date只能是越来越大,456列的inq_date也只能越来越大
但是第3列和第6列的inq_date可以不分大小
...全文
360 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
babynotooth 2015-12-19
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
我#3不是说了,要加一个ID。
    IF EXISTS(SELECT *
                FROM table1, inserted
               WHERE table1.img = inserted.img
                 AND table1.inq_date >= inserted.inq_date
                 AND table1.id < inserted.id) -- 漏了个条件,当前记录没有排除
        ROLLBACK TRANSACTION
明白了,谢谢
Tiger_Zhao 2015-12-18
  • 打赏
  • 举报
回复
我#3不是说了,要加一个ID。
    IF EXISTS(SELECT *
FROM table1, inserted
WHERE table1.img = inserted.img
AND table1.inq_date >= inserted.inq_date
AND table1.id < inserted.id) -- 漏了个条件,当前记录没有排除
ROLLBACK TRANSACTION
babynotooth 2015-12-18
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
问题1:times 改为非自增,插入时随便指定一个值,触发器会更新为下一个序号。然后需要加一个自增的ID来唯一标识记录。 问题2:跨行检查用触发器比约束好
CREATE TRIGGER tr_ins_table1
ON table1
FOR INSERT 
AS
BEGIN
    IF EXISTS(SELECT *
                FROM table1, inserted
               WHERE table1.jmg = inserted.jmg
                 AND table1.inq_date >= inserted.inq_date)
        ROLLBACK TRANSACTION

    DECLARE @last_time int

    SET @last_time = (SELECT MAX(t.times)
                        FROM table1, inserted
                       WHERE table1.jmg = inserted.jmg)

    IF (@last_time IS NULL)
        SET @last_time = 0

    UPDATE table1
       SET table1.times = @last_time + 1
      FROM table1, inserted
     WHERE table1.id = inserted.ID
END
[quote=引用 楼主 babynotooth 的回复:] 后面的 table1.id = inserted.ID , ID应该换成jmg吧 还有上面的t.times是什么 在运行的时候报错了,我改成了table1.times执行触发器生成了,但是不管怎么插入数据都是提示 (0 行受影响) 消息 3609,级别 16,状态 1,第 1 行 事务在触发器中结束。批处理已中止。
中国风 2015-12-18
  • 打赏
  • 举报
回复
Tiger_Zhao 2015-12-18
  • 打赏
  • 举报
回复
问题1:times 改为非自增,插入时随便指定一个值,触发器会更新为下一个序号。然后需要加一个自增的ID来唯一标识记录。
问题2:跨行检查用触发器比约束好
CREATE TRIGGER tr_ins_table1
ON table1
FOR INSERT
AS
BEGIN
IF EXISTS(SELECT *
FROM table1, inserted
WHERE table1.jmg = inserted.jmg
AND table1.inq_date >= inserted.inq_date)
ROLLBACK TRANSACTION

DECLARE @last_time int

SET @last_time = (SELECT MAX(t.times)
FROM table1, inserted
WHERE table1.jmg = inserted.jmg)

IF (@last_time IS NULL)
SET @last_time = 0

UPDATE table1
SET table1.times = @last_time + 1
FROM table1, inserted
WHERE table1.id = inserted.ID
END

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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