none
update如何判断某列是否重复,然后再执行相应动作? RRS feed

  • 问题

  •     表Table_1中有三列,分别是id、name、do,注意:id是自增的标示,name这个字段是不能有重名的

        我现在要更新名字,首先就要对name进行判断,条件是:

    1.如果名字改变,就要判断新的名字在name字段中是否有重复值,重复了就不执行update指令,并用case 返回0(表示错误)!(例如张三我改成李四,则不执行update,并返回0)

    2.如果名字不变,则执行update指令,并返回1。

    CREATE TABLE [dbo].[Table_1](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[name] [nchar](10) NULL,
    	[do] [nchar](10) NULL
    go
    INSERT INTO table_1
            ( name,do)
    VALUES  ( N'张三' , N'吃' ),
            ( N'李四' , N'喝' ),
            ( N'王五' , N'玩' );


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年7月26日 9:16

答案

  • 这样的话,放在一个事务里执行,如果存在重复回滚事务

    USE tempdb
    GO
    CREATE TABLE [dbo].[Table_1]
    (
    [id] [int] IDENTITY(1, 1)
             NOT NULL ,
    [name] [nchar](10) NULL ,
    [do] [nchar](10) NULL
    )
    
    go
    INSERT INTO table_1( name,do)
    SELECT N'张三' , N'吃' UNION ALL
    SELECT N'李四' , N'喝' UNION ALL
    SELECT N'王五' , N'玩'
    
    SELECT * FROM [Table_1]
    
    
    
    
    
    ----模拟存储过程传入参数值
    DECLARE @name_new NCHAR(200)
    SET @name_new = '王五'
    ------------------------------
    BEGIN TRAN
    UPDATE [Table_1] SET name=@name_new WHERE id=3
    
    IF  ( SELECT  COUNT(*)
                    FROM    [dbo].[Table_1]
                    WHERE   name = @name_new ) <2
        BEGIN
            COMMIT TRAN
            SELECT 1
        END
    ELSE 
        BEGIN
            ROLLBACK TRAN
            SELECT 0
        END
        
        
        
    --------------------------------------
    SELECT * FROM [dbo].[Table_1]
    
    
    
    
    

    2013年7月30日 13:14

全部回复

  • 你可以直接为 name 建立唯一约束(或者唯一索引), 这样不管是更新, 还是插入数据, 如果导致重复, 都会失败并且报错

    一般推荐这样做, 这样不管操作是否来自那里面, 都可以保证 name 的唯一性

    2013年7月26日 9:23
  • 如果确实无法通唯一索引(或约束)来保证唯一性, 那么语句上你可以用类似这样的操作

     

    DECLARE
    	@name_old nchar(10),	-- 要更新的 name
    	@name_new nchar(10)		-- 更新后的 name, NULL 值表示保持原来的值
    ;
    UPDATE [dbo].[Table_1]
    SET
    	name = ISNULL(@name_new, name)
    WHERE name = @name_old
    	AND(
    		@name_old = @name_new
    		OR @name_new IS NULL
    		OR NOT EXISTS(
    				SELECT * FROM [dbo].[Table_1]
    				WHERE name = @name_new
    		)
    	)
    
    

    2013年7月26日 9:31
  • 本来打算用触发器来做的,不过LZ需要有返回值,还是用普通sql来做

    --模拟存储过程传入参数值
    DECLARE @name_new NCHAR(200)
    SET @name_new = '张三'
    ------------------------------
    --代码判断
    IF NOT EXISTS ( SELECT  *
                    FROM    [dbo].[Table_1]
                    WHERE   name = @name_new ) 
        BEGIN
            UPDATE  [dbo].[Table_1]
            SET     [name] = @name_new
            WHERE   [id] = 1
            SELECT  1
        END
    ELSE 
        BEGIN
            SELECT  0
        END
    
    
    SELECT * FROM [dbo].[Table_1]
    
    --0:不更新  1:更新


    2013年7月27日 4:52
  •     抱歉前面没说清楚!再次仔细描述一下!

        我在AspNet界面有一个验证控件,这个控件如果通过验证,就执行Update语句。

         所以,这里我只需要让SQL做个判断(返回1或0),看能否通过验证!

        因此,sql需要做几种情况的判断:

        1.准备输入的name(就是在aspnet界面中准备输入的数据,下同),如果在table中不存在,则返回1,通过验证。

        2.准备输入的name,在Table存在,则要进行再次判断

             a.假如更新name后,name还是原来那个值,值不变,返回1。(张三还是张三)

             b.假如更新name后,name值和其他的name值重复了,返回0.

    总而言之一句话,在修改name前先要判断修改name后的结果是否是唯一的,再进行修改(就像是做评估


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年7月29日 3:58
  • LZ您第二个情况不是有矛盾吗?

    2.准备输入的name,在Table存在,则要进行再次判断

             a.假如更新name后,name还是原来那个值,值不变,返回1。(张三还是张三)

             b.假如更新name后,name值和其他的name值重复了,返回0.

    table里已经存在了,更新后还是一样啊

    2013年7月29日 6:09
  •     不矛盾啊,就是我在AspNet界面有一个验证控件,这个控件如果通过验证,就执行Update语句

        不是真正的用Update更新数据,而是对假如Update更新后的数据一个可行性判断

        下面是我以前写的一段,可是不行!如果我在aspnet界面中新输入的ContractNumber没有改变,也会通不过验证(应该是该通过的)!

    select  
    (case 
    when COUNT(ContractNumber)=0 then 1  
    when COUNT(ContractNumber)>=1 and COUNT (CID)=1 then 1 
    else 0 end) from ContractTable 
    WHERE     ContractNumber = @ContractNumber


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年7月29日 7:45
  • 还是不明白
    2013年7月29日 15:02
  •     也就是要预先判断一下,更新后是否name会有重复(比如:更新后出现两个“张三”就不行)。

       

        如果预先判断更新后没有重复的name,则返回1,否则返回0!


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!



    2013年7月30日 6:52
  • 这样的话,放在一个事务里执行,如果存在重复回滚事务

    USE tempdb
    GO
    CREATE TABLE [dbo].[Table_1]
    (
    [id] [int] IDENTITY(1, 1)
             NOT NULL ,
    [name] [nchar](10) NULL ,
    [do] [nchar](10) NULL
    )
    
    go
    INSERT INTO table_1( name,do)
    SELECT N'张三' , N'吃' UNION ALL
    SELECT N'李四' , N'喝' UNION ALL
    SELECT N'王五' , N'玩'
    
    SELECT * FROM [Table_1]
    
    
    
    
    
    ----模拟存储过程传入参数值
    DECLARE @name_new NCHAR(200)
    SET @name_new = '王五'
    ------------------------------
    BEGIN TRAN
    UPDATE [Table_1] SET name=@name_new WHERE id=3
    
    IF  ( SELECT  COUNT(*)
                    FROM    [dbo].[Table_1]
                    WHERE   name = @name_new ) <2
        BEGIN
            COMMIT TRAN
            SELECT 1
        END
    ELSE 
        BEGIN
            ROLLBACK TRAN
            SELECT 0
        END
        
        
        
    --------------------------------------
    SELECT * FROM [dbo].[Table_1]
    
    
    
    
    

    2013年7月30日 13:14
  • 非常感谢!一矢中的解决了我的问题,这个事务还真好用!

    下面是我根据需要修改后的代码

    DECLARE @name_new NCHAR(200)
    SET @name_new = '王五'
    BEGIN TRAN
    UPDATE [Table_1] SET name=@name_new WHERE id=5
    
    IF  ( SELECT  COUNT(*)
                    FROM    [dbo].[Table_1]
                    WHERE   name = @name_new ) <2
        BEGIN
            ROLLBACK TRAN 
            SELECT '1'
        END
    ELSE 
        BEGIN
            ROLLBACK TRAN
            SELECT '0'
        END


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!


    2013年7月31日 0:58