如何确保在 SQL 数据库字段中输入的值是唯一的?

Posted

技术标签:

【中文标题】如何确保在 SQL 数据库字段中输入的值是唯一的?【英文标题】:How to make sure the value am entering in an SQL database field is unique? 【发布时间】:2019-05-20 06:58:20 【问题描述】:

我从用户那里得到一个 vlue 并将其输入到我的数据库表中。但是,如果用户在已被占用的数据字段中输入值,我必须向用户抛出错误。

UPDATE Class_records SET The_number= '456' where class='mech-4B'

因此,这里通过将 mech-4B 下的每条记录的 The_number 设置为“456”来更新我的表。

我可以做什么样的查询语句,以便当另一个用户输入相同的数字 456 说“cse-4B”时,查询条件应该失败?

【问题讨论】:

所以多条记录可以具有相同的值,但前提是它们是在单个操作中设置的? 您使用的是哪个 dbms?我可能会在这里使用基于触发器的解决方案。 什么是 RDBMS?使用过程更新您的表,并在更新前检查现有数据。 @RobbyCornelissen 是的,多个记录可以具有相同的值(The_number)只有当它们具有相同的类名(mech 4b cse 4b 等)。如果有人将 The_number 分配给机甲 4B,则该号码现在不能被任何其他人使用 Add unique constraint to combination of two columns的可能重复 【参考方案1】:

您可以运行查询并检查受查询影响的行数。如果运行相同的查询,返回的行数很可能为零。如果为零,您可以向用户抛出错误或期望。

if (rowCount() > 0)
    //value is new 

else 
    //value is duplicated and throw error.

【讨论】:

sql 查询不会抛出异常,而不是返回“0 个受影响的行”吗? 如果你使用pdo,我们可以调用rowCount()方法返回受影响的行数,如果不受影响则返回0【参考方案2】:

如果您使用 mysql,您可以尝试在更新后添加“忽略”: “更新忽略 Class_records 集...”。

你可以看这篇文章:https://chartio.com/resources/tutorials/how-to-insert-if-row-does-not-exist-upsert-in-mysql/

如果您使用 T-SQL,您可以尝试使用“如果不存在...”: “如果不存在(从 Class_Records 中选择 *,其中 The_number ='456' 和 class='mech-4B') 开始 UPDATE Class_records SET The_number= '456' 其中 class='mech-4B' 结束”

你可以看看这篇文章:SQL Server 2008 - IF NOT EXISTS INSERT ELSE UPDATE

再见

【讨论】:

【参考方案3】:

所以你必须为它写一个存储过程:

CREATE PROCEDURE UpdateXYZTableWithUniqueness
    (@The_number AS INT,
     @class AS NVARCHAR)
AS 
BEGIN 
     SET NOCOUNT ON 

     IF ((SELECT COUNT(*)  
          FROM Class_records 
          WHERE The_number = @The_number) == 0)
     BEGIN
         UPDATE Class_records 
         SET The_number = @The_number 
         WHERE class = @class 
     END
     ELSE
     BEGIN
         PRINT 'Already Exits'
     END
END
GO

【讨论】:

如果 The_number 是 NVARCHAR 类型,此代码将如何变化 CREATE PROCEDURE UpdateAWBUnique @AWB_No as nvarchar, @InternalPOD as nvarchar AS BEGIN SET NOCOUNT ON if((SELECT count(*) From Def_tab WHERE AWB_No=@AWB_No) == 0) BEGIN UPDATE Def_tab SET AWB_No= @AWB_No where InternalPOD=@InternalPOD END ELSE BEGIN PRINT 'Already Exits' END END GO 以某种方式不断返回错误,即错误 102 SQLSTATE 420000 小心!! Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何varchar 变量和参数提供一个长度。您的@class 是长度为恰好一个字符的参数!这真的是你想要的吗????

以上是关于如何确保在 SQL 数据库字段中输入的值是唯一的?的主要内容,如果未能解决你的问题,请参考以下文章

如果另一列中的值是唯一的,那么如何在SQL中放置一个显示1的列,如果它是重复的则为0?

sql 当中 如何查询某个字段中的值的第几个字符中含有相应的值

SQL server约束

Mysql 数据字段值是用逗号隔开,如何写SQL语句

唯一约束

22 高级SQL特性