2013-05-08 153 views
8

我有一个表,看起来像这样:结合两个查询来检查MySQL中的重复?

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

这就是我想做的事:

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

如果Number不在数据库中,但名称是,请创建一个新名称并插入它。因此,举例来说,如果我有一个包含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. 

有没有办法可以将两个语句结合起来?

回答

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不是唯一的,但如果确实存在,我不想输入记录。” - 如果您不想在列上添加唯一性,则没有任何意义。你怎么知道这个号码是否已经存在?对Number的存在做一点检查对我来说感觉像是一个小小的开销。所以我最好的建议是强制执行唯一性。

+1

@ J.W。至少给我们**一些时间**来思考:P,因为你的回答非常完美,我们无法想出任何其他更好的答案。在之间让我连接你** FB ** :) – Luv 2013-05-12 16:37:56

+0

当我插入'罗伯特'而不是'罗伯特',您的查询结果错误:'数据截断:截断不正确INTEGER值:'0t'',而罗伯是新的名称和有效。 – ahoo 2013-05-12 20:48:11

+0

第二部分真的很神奇:) +1 – fthiella 2013-05-12 20:48:12

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"; 
} 
+0

有没有办法只返回它,如果只有数字不存在,基本上我不想做一个OR,但我仍然想要获得名称,即使该数字不存在,所以如果我做了一个像SELECT * FROM Person WHERE Number = 123 AND Name ='Bob''这样的查询,这将不会返回任何结果,但我不想要这样的结果,我想仍然使用Name返回一条记录。 – Xaisoft 2013-05-08 20:23:26

+0

我认为这是你想要的。$ number = 123; $ name ='Robert'; $ query = mysql_query(“SELECT * FROM Person WHERE Number = $ number OR Name ='$ name'”); if(mysql_num_rows($ query)== 0){ // - >添加你的记录,它是未使用的 } else if(mysql_result($ query,0,'number')== $ number && mysql_result( $ query,0,'name'== $ name)){ //数字和名称的组合已经存在 - >修改名称并添加记录 } else { echo“Number is used by another name”; } } – 2013-05-08 20:48:54

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,依此类推。

+0

*“我认为我的回答是最好的,所以我给了我自己的赏金。”* - 删除了你的答案。你有没有想过表演? – 2013-05-19 01:26:16

+0

@JW웃,我的答案适用于我们不希望对列实施'UNIQUE'约束的情况。因为Questionx @ Xaisoft并没有提到'UNIQUE'约束。 – ahoo 2013-05-19 23:58:01

1

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

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

你现在可以做一个插入与对重复

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

对于名字我会建议使用自动增量列,而不是后附加一个数字。

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)