如何确保在 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?