MySQL:从SELECT结果中连接(concat)字符串

5
我想在MySQL中自动命名字段username并插入数据,但我该如何做呢?
目前表中的数据如下:

+----+----------+
| id | username |
+----+----------+
|  1 | admin1   |
|  2 | admin2   |
+----+----------+

我尝试使用以下SQL语句,但无法执行:

INSERT INTO `tbl_user` (
`username`
)
VALUES (
CONCAT('admin',(SELECT MAX(SUBSTRING_INDEX(`username`,'admin',-1))+1 FROM `tbl_user`))
);

并且得到错误信息#1093 - You can't specify target table 'tbl_user' for update in FROM clause

我想要的最终结果是:

+----+----------+
| id | username |
+----+----------+
|  1 | admin1   |
|  2 | admin2   |
|  6 | admin3   |
|  9 | admin4   |
+----+----------+

是否可能实现?谢谢。


1
每次插入新用户时都需要吗?还是仅适用于一组初始设置?您可以使用“UPDATE”将“id”与“admin”连接起来。 - Michael Berkowski
我不会基于 id,而是使用 MAX(SUBSTRING_INDEX(username,'admin',-1))+1。这个可行吗? - Idham Perdameian
正如Michael Berkowski所建议的那样,只需进行INSERT然后UPDATE操作。 - Strawberry
2个回答

6
你可以使用一个触发器,在插入后更新列用户名。以下是有关如何实际执行此操作的更多信息:http://www.roseindia.net/sql/trigger/mysql-trigger-after-insert.shtml 编辑 我忘记了MySQL不允许您从在同一表上声明的触发器更新表格。
但是,这应该能够完成你要做的事情。
SET @id := (SELECT id FROM YOUR_TABLE ORDER BY id DESC LIMIT 1);
INSERT INTO YOUR_TABLE (username) VALUES(
   CONCAT("ADMIN", @id + 1)
);

1
查询:

SQLFIDDLE示例

INSERT INTO `tbl_user` (
`username`
)
VALUES (
CONCAT('admin',(SELECT MAX(CAST(REPLACE(`username`,'admin','') AS SIGNED INTEGER))+1 
                FROM (SELECT * FROM tbl_user) t))
);

结果:

|     ID | USERNAME |
---------------------
|      1 |   admin1 |
|      2 |   admin2 |
| (null) |   admin3 |

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接