mysql - 自动插入具有重复数据的行,遵循两种模式

标签 mysql sql mariadb

我有一个如下所示的表格:

| id  | letter | number |
|-----|--------|--------|
| 1   | a      | 1      |
| 2   | b      | 1      |
| 3   | c      | 1      |
| 4   | d      | 1      |
| 5   | a      | 2      |
| 6   | b      | 2      |
| 7   | c      | 2      |
| 8   | d      | 2      |
| 9   | a      | 3      |
| 10  | b      | 3      |
| 11  | c      | 3      |
| 12  | d      | 3      |
|etc..|        |        |

我正在尝试创建一个 SQL 语句,按照此模式自动填充表,直到 id 456。

所以字母是 ABCD ABCD 直到序列结束,并且每个 4 个“组”都有一个数字,应该达到 114。

我不确定解决这个问题的最佳方法是什么,任何建议将不胜感激。

最佳答案

您可以使用以下 SQL 脚本将所需的值插入表中:

INSERT INTO target (id, letter, `number`)
SELECT rn, col, (rn - 1) % 4 + 1 AS seq
FROM (
SELECT col, @rn := @rn + 1 AS rn 
FROM (
   SELECT 'a' AS col UNION ALL SELECT 'b' UNION ALL
   SELECT 'c' UNION ALL SELECT 'd') AS t
CROSS JOIN (
   SELECT 1 AS x UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
   SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
   SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ) AS t1
CROSS JOIN (
   SELECT 1 AS x UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
   SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
   SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ) AS t2
CROSS JOIN (SELECT @rn := 0) AS var  ) AS s
WHERE rn <= 456

上面的查询使用 11 x 11 笛卡尔积创建一个包含 121 行的数字表。这些行与内联表 ('a'), ('b'), ('c'), ('d') 交叉连接,总共生成 484 行。外部查询仅选择所需的行,即总共 456 行。

注意:如果您想插入值:

id, letter, number
1   'a'     1
2   'b'     1
3   'c'     1
4   'd'     1
5   'a'     2
6   'b'     2
7   'c'     2
8   'd'     2
... etc

而不是值:

id, letter, number
1   'a'     1
2   'b'     2
3   'c'     3
4   'd'     4
5   'a'     1
6   'b'     2
7   'c'     3
8   'd'     4
... etc

然后只需将 (rn - 1) % 4 + 1 AS seq 替换为 (rn - 1) DIV 4 + 1 AS seq

Demo here

关于mysql - 自动插入具有重复数据的行,遵循两种模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35041250/

相关文章:

mysql - 使用 include 时 Sequelize 查询仅返回一行

sql - 将 .sql 文件中的语句插入 Oracle 数据库,结果为 ORA-01704 : string literal too long

mysql - 多大师挑战 | MySQL 和 MariaDB

mysql - sql server 函数在 maxdate 时返回 true

php - 日期未更新的 MySQL/PHP 更新查询

sql - 从 BigQuery 中的 GA 日期提取月份

java - Hibernate:如何指定聚簇索引注释

mysql - 列计数与第 1 行的值计数不匹配

mysql - MariaDB 将二进制转换为 int

mysql - 连接用户和消息的数据库设计困境