简体   繁体   English

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

[英]SQL Server : Stored Procedure for Preventing Duplicated Values

I have this code which I have created which I want to stop any duplicated values from being inserted into the database, however the values still continue to be able to get into the IF_Translations table.我有我创建的这段代码,我想阻止任何重复的值插入到数据库中,但是这些值仍然能够继续进入IF_Translations表。 I have tried changing the 0 to a -1 on this line:我曾尝试在这一行将 0 更改为 -1:

IF (SELECT COUNT(*) FROM IF_TRANSLATIONS WHERE INVALUE = @INVALUE) = 0

Any help?有什么帮助吗?

Code:代码:

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

The correct solution is to let the database check the integrity.正确的解决办法是让数据库检查完整性。 You would do this with a unique constraint or index (the two are equivalent for this purpose):您可以使用唯一约束或索引来执行此操作(出于此目的,两者是等效的):

alter table if_translations add constraint unq_if_translations_invalue
    unique (invalue);

You should also fix the ID so it is an IDENTITY column -- incrementing the value in your code is not safe, unless you lock the entire table and that is quite expensive.您还应该修复ID ,使其成为IDENTITY列——增加代码中的值是不安全的,除非您锁定整个表并且这非常昂贵。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM