我有一个看起来像这样的表:
Number | Name
--------+--------
123 | Robert
这就是我想要做的事情:
如果数字已存在于数据库中,请勿插入新记录。
如果数字不在数据库中,但名称是,则创建一个新名称并插入它。例如,如果我有123
的{{1}}和Number
的{{1}}的记录,我不想插入它,但如果我得到一条记录其中包含Bob
的{{1}}和Name
的{{1}},我会插入456
和Number
。我打算单独检查重复项:
Robert
有没有办法可以合并这两个陈述?
答案 0 :(得分:9)
你的问题实际上有两个问题。第一个问题是使Number
列唯一,第二个问题是通过附加一个已存在的数字来增加列Name
。
第一部分
由于该数字为UNIQUE
,因此对该列强制执行UNIQUE
约束。它可以是PRIMARY KEY
或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
的存在做一点检查对我来说感觉有点开销。因此,我最好的建议是强制执行唯一性。
答案 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)