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

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

这就是我想要做的:

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

如果编号不在数据库中,但是名称在数据库中,则创建一个新名称并将其插入。因此,例如,如果我有一个包含123NumberBobName的记录,我不想插入它,但是如果我得到一个包含456NumberRobertname的记录,我将插入456Robert1 。我本来要检查重复项,例如:
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.

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

最佳答案

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

第一部分

由于数字为UNIQUE,因此在列上实现了UNIQUE约束。它可以是PRIMARY KEYUNIQUE KEY

如果该列没有KEY,而您想使其成为PRIMARY,则这是ALTER语句:

ALTER TABLE TableName ADD CONSTRAINT tb_pk PRIMARY KEY (Number)
  • SQLFiddle Demo

  • 但是如果您只希望它是UNIQUE而不是主键,
    ALTER TABLE TableName ADD CONSTRAINT tb_uq UNIQUE (Number)
    
  • SQLFiddle Demo

  • 第二部分

    实际上,您可以不使用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%'
    
  • SQLFiddle Demo
  • SQLFiddle Demo (added more example)
  • SQLFiddle Demo (throws exception due to uniqueness)

  • 一些细节:

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

    关于mysql - 结合两个查询来检查MySQL中的重复项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16449377/

    10-11 23:43