我有一个看起来像这样的表:
Number | Name
--------+--------
123 | Robert
Run Code Online (Sandbox Code Playgroud)
这就是我想要做的:
如果数字已在数据库中,请不要插入新记录.
如果数字不在数据库中,但名称是,则创建一个新名称并插入它.所以例如,如果我有一个包含123for Number和Bobfor 的记录Name,我不想插入它,但如果我得到一个包含456for Number和Robertfor 的记录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.
Run Code Online (Sandbox Code Playgroud)
有没有办法可以将这两种说法结合起来?
你的问题实际上有两个问题.第一个问题是使Number列唯一,第二个问题是Name通过附加一个已存在的数字来增加列.
第一部分
由于数字是UNIQUE,UNIQUE对列强制执行约束.它可以是a PRIMARY KEY或a UNIQUE KEY.
如果列没有KEY并且你想要它PRIMARY,那么这是ALTER声明:
ALTER TABLE TableName ADD CONSTRAINT tb_pk PRIMARY KEY (Number)
Run Code Online (Sandbox Code Playgroud)
但如果你只想要它UNIQUE而不是主键,
ALTER TABLE TableName ADD CONSTRAINT tb_uq UNIQUE (Number)
Run Code Online (Sandbox Code Playgroud)
第二部分
你可以在不使用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%'
Run Code Online (Sandbox Code Playgroud)
一些细节:
当列上提供的值Number已经存在时,它将抛出一个错误,因为该列是唯一的.我已经从已删除的帖子中读到了一条评论:"..Number并不是唯一的,但如果确实存在,我不想输入记录." - 如果您不想在列上添加唯一性,则没有任何意义.你怎么知道号码是否已经存在?Number对我的存在做一点检查对我来说感觉有点开销.因此,我最好的建议是强制执行唯一性.