我有一个看起来像这样的表:
Number | Name
--------+--------
123 | Robert
这就是我想要做的:
如果号码已经在数据库中,请不要插入新记录。
如果编号不在数据库中,但是名称在数据库中,则创建一个新名称并将其插入。因此,例如,如果我有一个包含
123
的Number
和Bob
的Name
的记录,我不想插入它,但是如果我得到一个包含456
的Number
和Robert
的name
的记录,我将插入456
和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.
有没有办法将两个语句组合在一起?
最佳答案
您的问题实际上有两个问题。第一个问题是使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)
第二部分
实际上,您可以不使用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%'
一些细节:
当在
Number
列上提供的值已经存在时,由于该列是唯一的,因此将引发错误。我从已删除的帖子中读到一条评论,上面写着:“..数字不是唯一的,但如果确实存在,则我不想输入记录。” -如果您不想在列上添加唯一性,则没有任何意义。您怎么知道这个号码是否已经存在?对Number
的存在进行一些检查对我来说似乎有点负担。因此,我最好的建议是强制执行唯一性。关于mysql - 结合两个查询来检查MySQL中的重复项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16449377/