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

时间:2013-05-08 20:13:20

标签: mysql sql

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

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

这就是我想要做的事情:

如果数字已存在于数据库中,请勿插入新记录。

如果数字不在数据库中,但名称是,则创建一个新名称并插入它。例如,如果我有123的{​​{1}}和Number的{​​{1}}的记录,我不想插入它,但如果我得到一条记录其中包含Bob的{​​{1}}和Name的{​​{1}},我会插入456Number。我打算单独检查重复项:

Robert

有没有办法可以合并这两个陈述?

5 个答案:

答案 0 :(得分:9)

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

第一部分

由于该数字为UNIQUE,因此对该列强制执行UNIQUE约束。它可以是PRIMARY KEYUNIQUE KEY

如果该列没有KEY,并且您希望将其设为PRIMARY,则此处为ALTER声明:

ALTER TABLE TableName ADD CONSTRAINT tb_pk PRIMARY KEY (Number)

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

ALTER TABLE TableName ADD CONSTRAINT tb_uq UNIQUE (Number)

第二部分

您实际上可以在不使用连接的情况下执行此操作。

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的存在做一点检查对我来说感觉有点开销。因此,我最好的建议是强制执行唯一性。

答案 1 :(得分:1)

SELECT * FROM Person WHERE Number = 123 OR Name = 'Robert'

我有一段时间没用过SQL,所以这可能是错的;)

编辑:

$number = 123;
$name = 'Robert';
$query = mysql_query("SELECT * FROM Person WHERE Number = $number OR Name = '$name' ");

if (mysql_num_rows($query) == 0 ) {
//-> Add your record, it's unused
} else if (mysql_result($query, 0, 'number') == $number && mysql_result($query, 0, 'name' == $name)) {
//combination of number and name already exists -> modify name and add record
} else {
echo "Number is used by another name";
}

答案 2 :(得分:1)

使用此查询,插入行[123, 'Robert']。如果您想插入其他值,请更改123&以下查询中的Robert值:

insert into Person (Number,Name)
select 123, IF(mn.MaxNumber is NULL,'Robert',concat('Robert',mn.MaxNumber+1))
from (SELECT 'foo') foo
left JOIN (select max(CONVERT(SUBSTR(Name,LENGTH('Robert')+1),UNSIGNED)) `MaxNumber`
            from person where name rlike '^Robert[0-9]*$') mn on 1=1
where Not Exists (select * from Person where Number=123)

注意:如果表中存在Robert,则上面的查询会插入Robert1。如果存在Robert1,则会插入Robert2,依此类推。

答案 3 :(得分:1)

使数字和名称都是唯一的。

   ALTER TABLE  `person` ADD UNIQUE (`number` ,`name`); 

现在可以使用ON DUPLICATE进行插入

INSERT INTO `person` (`number`, `name`, `id`) VALUES ('322', 'robert', 'NULL')       ON DUPLICATE  KEY UPDATE `id`='NULL';

如果在名称后附加一个数字,我建议改为使用自动增量列。

答案 4 :(得分:0)

insert into Person (Number,Name)
select 123, IF(mn.MaxNumber is NULL,'Robert',concat('Robert',mn.MaxNumber+1))
from (SELECT 'foo') foo
left JOIN (select max(CONVERT(SUBSTR(Name,LENGTH('Robert')+1),UNSIGNED)) `MaxNumber`
            from person where name rlike '^Robert[0-9]*$') mn on true
where Not Exists (select * from Person where Number=123)