小编典典

结合两个查询来检查MySQL中的重复项?

sql

我有一个看起来像这样的表:

Number  | Name 
--------+--------
123     | Robert

这就是我想要做的:

如果号码已经在数据库中,请不要插入新记录。

如果编号不在数据库中,但名称在数据库中,则创建一个新名称并将其插入。因此,例如,如果我有一个包含123forNumberBobfor的记录Name,我不想插入它,但是如果我得到一个包含456forNumberRobertfor的记录name,我会插入456and
Robert1。我本来要检查重复项,例如:

SELECT * FROM Person where Number = 123;

//If number is not found
SELECT * FROM Person where Name = 'Robert';

//If name is found, add a number to it.

有没有办法将两个语句组合在一起?


阅读 231

收藏
2021-03-23

共1个答案

小编典典

您的问题实际上有两个问题。第一个问题是使Number列唯一,第二个问题是Name通过添加数字(如果已经存在)来增加列。

第一部分

由于数字为UNIQUE,因此UNIQUE对列实施约束。可能是aPRIMARY KEY或a UNIQUE KEY

如果该列没有,KEY而您想创建该列PRIMARY,则ALTER语句如下:

ALTER TABLE TableName ADD CONSTRAINT tb_pk PRIMARY KEY (Number)

但是如果您只希望它UNIQUE成为主键而不是主键,

ALTER TABLE TableName ADD CONSTRAINT tb_uq UNIQUE (Number)

第二部分

实际上,您可以不使用join来执行此操作。

INSERT INTO TableName(Number, Name)
SELECT  124 AS Number, 
        CONCAT('Robert', COALESCE(MAX(CAST(REPLACE(Name, 'Robert', '0') AS UNSIGNED)) + 1,'')) AS Name
FROM    TableName
WHERE   Name LIKE 'Robert%'

一些细节:

当列上提供的值Number已经存在时,由于列是唯一的,因此将引发错误。我从已删除的帖子中读到一条评论,上面写着:
..数字不是唯一的,但如果确实存在,则我不想输入记录。”
-如果您不想在列上添加 唯一性
,则没有任何意义。您怎么知道这个号码是否已经存在?对Number感觉的存在进行一点检查对我来说有点像是开销。因此,我最好的建议是强制执行唯一性。

2021-03-23