2017-05-29 126 views
0

表应该是这样的:INSERT语句SELECT CONCAT

idname a c name 
1  b d elisa1 
2  b d elisa2 
3  b d elisa3 

而接下来ELISAelisa4

而INSERT语句:

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语句赢得”根本不添加任何记录。

+0

是您的查询的正常工作? –

+0

@FahadAnjum是啊.. idname,a,c但没有名字。任何想法? – Max70

+0

你插入到你选择的同一张表吗?所以在这个操作之后,新记录将有'a,b'列等于null? – Alex

回答

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%' 
), '')); 

FYI:这种查询是竞争条件的对象和简化版,保证唯一性生成name值。两个或更多连接可能同时获得相同的值。因此,您需要关注客户端代码中的这些情况,即捕获唯一的违反约束的异常,并重复执行此查询几次,直至获得成功的结果。

这里是一个dbfiddle演示

结果:

 
+--------+------+------+--------+ 
| idname | a | c | name | 
+--------+------+------+--------+ 
|  1 | b | d | elisa1 | 
|  2 | b | d | elisa2 | 
|  3 | b | d | elisa3 | 
|  4 | b | d | elisa4 | 
+--------+------+------+--------+ 
+0

去建立一个隧道。谢谢! – Max70

0

有些傲慢的家伙会坚持你需要使用数据库序列,但是这取决于你想实现什么,像将与甲骨文合作:或者

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)); 
+0

这不是一个oracle的问题。 mysql中不存在函数'nvl'。 mysql不允许用户通过'currval'或'nextval'或者 –

+0

Dang与序列交互。是。 NVL是Oracle。对于其他人,使用coalesce(max(val),'0')+ 1 – user1683793

0

有两个问题:

  1. 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%' 
    
  2. CONCAT('elisa', CASE WHEN COUNT(idname) = 0 THEN '' ELSE COUNT(idname) END)将导致值idname &后缀之间存在滞后name,即行,其中idname = 2name = elisa1在后。这与问题中所要求的内容不同。

    要改变这种状况,我们可以写

    CONCAT('elisa', COUNT(idname)+1)