开发者社区> 问答> 正文

SQL Server:防止重复值的存储过程

我已经创建了这段代码,想要停止将任何重复的值插入数据库,但是这些值仍然可以继续进入IF_Translations表中。我试图在此行上将0更改为-1:

IF (SELECT COUNT(*) FROM IF_TRANSLATIONS WHERE INVALUE = @INVALUE) = 0 有什么帮助吗?

码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[translationduplicate]
AS
    SET NOCOUNT ON;

    DECLARE @ID INT, @TRANSLATE_ID VARCHAR(15), @INVALUE VARCHAR(15),
            @OUTVALUE VARCHAR(15), @CONV_DIRECTION VARCHAR(5), 
            @PLANT_ID VARCHAR(5), @LMOD DATETIME

    IF (SELECT COUNT(*) FROM IF_TRANSLATIONS WHERE INVALUE = @INVALUE) = 0
    BEGIN   
        INSERT INTO IF_TRANSLATIONS(ID, TRANSLATE_ID, INVALUE, OUTVALUE, CONV_DIRECTION, PLANT_ID)    
      VALUES((SELECT MAX(ID)FROM [OPERATOR_LIVE_43].[dbo].[IF_TRANSLATIONS]) + 1, @TRANSLATE_ID, @INVALUE, @OUTVALUE, 3, @PLANT_ID)
    END

展开
收起
祖安文状元 2020-01-04 15:43:49 645 0
1 条回答
写回答
取消 提交回答
  • 正确的解决方案是让数据库检查完整性。您可以使用唯一的约束或索引来完成此操作(为此目的,两者是等效的):

    alter table if_translations add constraint unq_if_translations_invalue
        unique (invalue);
    
    

    您还应该修复ID它,使其成为一IDENTITY列-在代码中递增值并不安全,除非您锁定整个表,这非常昂贵。

    2020-01-04 15:44:00
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server在电子商务中的应用与实践 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载