我有一个包含几个字段的表。主键是userId
。目前,user id
列包含值'1,2,3,4 ......等',如下所示:
+------+
|userId|
+------+
| 1 |
| 2 |
| 3 |
| 4 |
...etc
我现在想要添加以a,b,c结尾的新行,如下所示:
+------+
|userId|
+------+
| 1 |
| 1a |
| 1b |
| 1c |
| 2 |
| 2a |
| 2b |
| 2c |
...etc
新行应与其父行相同,但userId除外。 (即1a,1b和1c应匹配1)
此外,我不能保证在用户标识栏中不会有一些“a”,“b”或“c”。
有没有办法编写SQL查询来快速轻松地完成这项工作?
答案 0 :(得分:3)
请不要这样你会遇到比你想要解决的问题更多的问题!
添加一个新列来存储该字母,并使主键覆盖原始UserId和此新列。
如果你只是想要userId,你需要关闭字母部分,这对你的查询来说是昂贵的,并且是一个真正的痛苦。
答案 1 :(得分:1)
我同意KM。我不确定你为什么要创建这些重复/复合ID,但感觉这是一个令人不舒服的方向。
那就是说,只有一个需要克服的障碍;显然你无法从MySQL中选择并插入到同一个表中。
因此,您需要先插入临时表,然后插入真实表...
CREATE Temporary TABLE MyNewUserIDs (
UserID VARCHAR(32)
)
INSERT INTO
myNewUserIDs
SELECT
CONCAT(myTable.UserID, suffix.val)
FROM
myTable
INNER JOIN
(SELECT 'A' as val UNION ALL SELECT 'B' UNION ALL SELECT 'C' UNION ALL SELECT 'D') AS suffix
ON RIGHT(myTable.UserID, 1) <> Suffix.val
WHERE
NOT EXISTS (SELECT * FROM myTable AS lookup WHERE UserID = CONCAT(myTable.UserID, suffix.val))
INSERT INTO
myTable
SELECT
UserID
FROM
MyNewUserIDs
根据您的环境,您可能希望查看锁定表格,以便在创建ID列表和将其插入表格之间不进行更改。
答案 2 :(得分:0)
从SQL的角度来看,生成额外的行非常简单:我会在这里做到这一点
@ Km的回答告诉你如何将它存储为2个不同的值,我在这里假设。如果您愿意,可以随意连接用户ID和后缀。
INSERT myTable (userid, suffix, co11, col2, ...coln)
SELECT M.userid, X.suffix, M.col1, M.col2, ..., M.coln
FROM
myTable M
CROSS JOIN
(SELECT 'a' AS Suffix UNION ALL SELECT 'b' UNION ALL SELECT 'c') X
WHERE
NOT EXISTS (SELECT *
FROM
MyTable M2
WHERE
M2.userid = M.userid ANS M2.Suffix = X.Suffix)