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

Xai*_*oft 8 mysql sql

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

Number  | Name 
--------+--------
123     | Robert
Run Code Online (Sandbox Code Playgroud)

这就是我想要做的:

如果数字已在数据库中,请不要插入新记录.

如果数字不在数据库中,但名称是,则创建一个新名称并插入它.所以例如,如果我有一个包含123for NumberBobfor 的记录Name,我不想插入它,但如果我得到一个包含456for NumberRobertfor 的记录name,我会插入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.
Run Code Online (Sandbox Code Playgroud)

有没有办法可以将这两种说法结合起来?

Joh*_*Woo 9

你的问题实际上有两个问题.第一个问题是使Number列唯一,第二个问题是Name通过附加一个已存在的数字来增加列.

第一部分

由于数字是UNIQUE,UNIQUE对列强制执行约束.它可以是a PRIMARY KEY或a UNIQUE KEY.

如果列没有KEY并且你想要它PRIMARY,那么这是ALTER声明:

ALTER TABLE TableName ADD CONSTRAINT tb_pk PRIMARY KEY (Number)
Run Code Online (Sandbox Code Playgroud)

但如果你只想要它UNIQUE而不是主键,

ALTER TABLE TableName ADD CONSTRAINT tb_uq UNIQUE (Number)
Run Code Online (Sandbox Code Playgroud)

第二部分

你可以在不使用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%'
Run Code Online (Sandbox Code Playgroud)

一些细节:

当列上提供的值Number已经存在时,它将抛出一个错误,因为该列是唯一的.我已经从已删除的帖子中读到了一条评论:"..Number并不是唯一的,但如果确实存在,我不想输入记录." - 如果您不想在列上添加唯一性,则没有任何意义.你怎么知道号码是否已经存在?Number对我的存在做一点检查对我来说感觉有点开销.因此,我最好的建议是强制执行唯一性.

  • 只是一件小事...我认为你应该使用`WHERE Name RLIKE'^ Robert [0-9]*$'`或类似的东西 (3认同)