8

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

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

这就是我想要做的:

如果 Number 已经在数据库中,则不要插入新记录。

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

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

4

5 回答 5

9

你的问题实际上有两个问题。第一个问题是使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)

第二部分

您实际上可以在不使用连接的情况下做到这一点。

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感觉有点开销。所以我最好的建议是强制执行唯一性。

于 2013-05-12T16:28:45.643 回答
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';

对于在名称后附加一个数字,我建议改用自动增量列。

于 2013-05-17T16:08:41.707 回答
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";
}
于 2013-05-08T20:15:32.957 回答
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,依此类推。

于 2013-05-08T21:12:34.620 回答
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)
于 2013-05-18T20:42:56.840 回答