set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [dbo].[LZUpdate]
   ON  [dbo].[HYW_T_MQTXDY]
   after update
AS 
     
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
declare @id  int
declare @sw  numeric(20,3)
declare @sim  char(11) 
declare @LL numeric(20,3)
    declare @LJLL numeric(20,3)
declare @LS numeric(20,3)
declare @GC numeric(20,3)
select @id= MQTXDY_N_ID from Inserted
select @sw= MQTXDY_N_SW from Inserted
select @sim =   MQTXDY_C_SIM from Inserted
select @LL= SS_N_ssll from Inserted
select @LJLL= SS_N_LJLL from Inserted
select @LS= SS_N_LS from Inserted
select @GC = MQTXDY_N_JSH from Inserted
SET NOCOUNT ON;
 
insert into dbo.ST_RIVER_R(STCD,TM,Z,Q,ADDQ,XSAVV) values(@sim,getDate(),@sw+@GC,@LL,@LJLL,@LS)
    -- Insert statements for trigger here
 
END
 触发器代码如上,当更新HYW_T_MQTXDY的时候 插一条记录到ST_RIVER_R表。STCD,TM 是ST_RIVER_R表的主健,但是当我在网站上更新HYW_T_MQTXDY的记录时。总是抱错!
+ InnerException {"违反了 PRIMARY KEY 约束 'PK_ST_RIVER_R'。不能在对象 'ST_RIVER_R' 中插入重复键。\r\n语句已终止。"} System.Exception {System.Data.SqlClient.SqlException}
可是我的主健TM 用的是Getdate()阿,怎么会重复呢?
现在就是这个触发器总是抱错,该怎么解决?

解决方案 »

  1.   

    更新记录(UPDATE),触发器中应该在“ST_RIVER_R”中先删除,再插入.
      

  2.   

    楼上说的有问题,我每次更新HYW_T_MQTXDY 都是往ST_RIVER_R 里边插入。为何要删除以前的?没道理阿。
    而且每次都用getdate()怎么会主见重复呢?实在不明白
      

  3.   

    你更新HYW_T_MQTXDY是用什么指令呢?
      

  4.   

    加个判断条件
    IF update(HYW_T_MQTXDY)
    begin
    insert into dbo.ST_RIVER_R(STCD,TM,Z,Q,ADDQ,XSAVV) 
    values(@sim,getDate(),@sw+@GC,@LL,@LJLL,@LS)
     
    end
      

  5.   

    update指令 但是对于ST_RIVER_R 只有insert没有任何update,而且任何时刻都提示那个错误。每一分每一秒getdate()都在变才对啊。为什么会说重复键值呢?。抓狂
      

  6.   

    IF update(HYW_T_MQTXDY)
    这个语句过不去
    说列名 HYW_T_MQTXDY 无效?
      

  7.   

    IF update(HYW_T_MQTXDY)
    HYW_T_MQTXDY---->表示字段名
    意思是如果改这个字段,就执行if里面的代码
      

  8.   

    道理就是你每次update  HYW_T_MQTXDY时,就会对ST_RIVER_R产生insert指令
      

  9.   

    道理就是你每次update  HYW_T_MQTXDY时,就会对ST_RIVER_R产生insert指令
    但是 insert为什么会有重复键值?getdate()时刻变化的。兄弟不明白阿。。
      

  10.   

    PK_ST_RIVER_R你是按什么字段索引的?
      

  11.   

    先抛开错误的原因,那个可能要看你的具体表结构。
    这个是自己写来测试的吗,感觉这样写会出问题呢。
    1、你用getdate()做主键,你确定在同一时间只有一条数据插入?
    2、你确定不考虑没有数据或者是同时多条数据的插入么?我的意思是用类似于这种语法:
    insert into HYW_T_MQTXDY
    select * from 表
    where 条件
    按常规在这里是要用@@ROWCOUNT取得inserted的行数并按三种情况判断的。
    0条,这种也不是没可能,如果你的select子句没取得数据;
    1条,理想的情况;
    多条,当select子句取得多条数据;
    在0条或多条的情况下,你的代码就会出现问题了。
    当然,你说你能够用其它方式保证以上的情况不出现,就没有问题了,我只是提醒一下。