表应该如下所示:
idname a c name
1 b d elisa1
2 b d elisa2
3 b d elisa3下一个elisa将是elisa4
以及插入的声明:
INSERT INTO patients
SET a=b, c=d (name)
SELECT CONCAT('elisa', CASE WHEN COUNT(idname) = 0 THEN '' ELSE COUNT(idname) END),
FROM patients WHERE name LIKE 'elisa%INSERT语句根本不会添加任何记录。
发布于 2017-05-29 18:49:32
有些傲慢的家伙会坚持你需要使用数据库序列,但取决于你想要实现的目标,比如将使用Oracle:
INSERT INTO patients VALUES(
(SELECT COUNT(*) FROM patients WHERE name LIKE 'elisa%'),
'b','d',
(SELECT CONCAT('elisa', CASE WHEN COUNT(idname) THEN 0 ELSE COUNT(idname) END) FROM patients WHERE name LIKE 'elisa%'));或者,如果你可能在数字上有差距,并且拥有独特的、不断增加的数字很重要,这样的事情可能会被证明更令人满意:
INSERT INTO patients VALUES(
(SELECT NVL(MAX(idname),0)+1 FROM patients WHERE name LIKE 'elisa%'),
'b','d',
CONCAT('elisa', (SELECT NVL(MAX(idname),0)+1 FROM patients WHERE name LIKE 'elisa%')));请记住,如果同时进行多个事务,这些操作将不能正常工作。为此,您将需要一个数据库序列,但随后将为所有名称设置一组数字,因此elisa5后面将跟着bob6和joe7。
数据库序列版本:
INSERT INTO patients VALUES(
patient_name_seq.currval,
'b','d',
CONCAT('elisa',patient_name_seq.nextval));发布于 2017-05-29 18:49:33
有两个问题:
SET用于更新,而不是插入。查询应该具有以下形式
在病人中插入(a,c," name "),从病人中选择'b‘,'d’,CONCAT('elisa',当计数(Idname)=0时,从名为'elisa%‘的病人中插入’END COUNT(idname)结束‘。CONCAT('elisa', CASE WHEN COUNT(idname) = 0 THEN '' ELSE COUNT(idname) END)将导致值idname & name后面的后缀(即idname = 2,name = elisa1 )行之间的滞后。这与问题中所表示的不同。
要改变这种状况,我们可以写
(“elisa”,计数(Idname)+1)https://stackoverflow.com/questions/44247945
复制相似问题