表应如下所示:
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%
接下来 elisa 将 elisa4
INSERT语句:
startTime = "9:00AM"
endTime = "11:00AM"
INSERT语句根本不会添加任何记录。
答案 0 :(得分:0)
一些傲慢的家伙会坚持你需要使用一个数据库序列,但是根据你想要完成的事情,类似的东西会与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));
答案 1 :(得分:0)
有两个问题:
SET
用于更新,而非插入。查询应具有
INSERT INTO patients (a, c, "name")
SELECT
'b'
, 'd'
, CONCAT('elisa', CASE WHEN COUNT(idname) = 0 THEN '' ELSE COUNT(idname) END)
FROM patients WHERE name LIKE 'elisa%'
CONCAT('elisa', CASE WHEN COUNT(idname) = 0 THEN '' ELSE COUNT(idname) END)
会导致价值idname
& name
之后的后缀,即idname
= 2
,name
= elisa1
的行。这与问题中所要求的内容不同。
要改变这一点,我们可以写
CONCAT('elisa', COUNT(idname)+1)
答案 2 :(得分:0)
你可以这样做
INSERT INTO patients (a, c, name)
SELECT 'b', 'd', CONCAT('elisa', COALESCE((
SELECT SUBSTRING(MAX(name), CHAR_LENGTH('elisa') + 1) + 1
FROM patients
WHERE name LIKE 'elisa%'
), ''));
仅供参考:此类查询是竞争条件的主题,并不保证生成的name
值的唯一性。两个或更多个连接可以同时获得相同的值。因此,您需要在客户端代码中处理这些情况,即捕获唯一的约束违例异常并重试此查询几次,直到您获得成功结果。
这是dbfiddle演示
结果:
+--------+------+------+--------+ | idname | a | c | name | +--------+------+------+--------+ | 1 | b | d | elisa1 | | 2 | b | d | elisa2 | | 3 | b | d | elisa3 | | 4 | b | d | elisa4 | +--------+------+------+--------+