【问题标题】:Using RECURSIVE CTE with INSERT SELECT to generate table data with MariaDB使用带有 INSERT SELECT 的 RECURSIVE CTE 通过 MariaDB 生成表数据
【发布时间】:2018-07-08 17:53:45
【问题描述】:

我在 Windows 7 上使用 Maria DB 版本 10.2.9,

MariaDB > select @@version;
+----------------+
| @@version      |
+----------------+
| 10.2.9-MariaDB |
+----------------+

我正在尝试使用带有 INSERT SELECT 的递归 CTE 来创建一些测试数据。为简单起见,下面是要填充的单列表:

CREATE TABLE cte_populated
(
  id INT NOT NULL PRIMARY KEY
)
  ENGINE = InnoDB;

以及生成值 1 到 10 的 CTE:

WITH  RECURSIVE int_seq AS (
SELECT 1 AS val
UNION ALL
SELECT val + 1
FROM int_seq
WHERE val  < 10
)
INSERT cte_populated(id)
SELECT int_seq.val FROM int_seq;

以上会产生语法错误。 请注意,如果删除插入行,则 10 行将按预期显示,SELECT 语句中的值为 1 到 10。

有人知道在 INSERT/SELECT 查询中使用 CTE 的限制或任何解决方法吗?

更新: 以下两个查询有效,一个来自@elenst 回复,另一个来自提供@PM 77 评论中的链接:

INSERT cte_populated(id)
WITH  RECURSIVE int_seq AS (
SELECT 1 AS val
UNION ALL
SELECT val + 1
FROM int_seq
WHERE val  < 10)
SELECT int_seq.val as id FROM int_seq;

以下内容改编自@PM 77 提供的link

INSERT INTO cte_populated
WITH  RECURSIVE int_seq(val) AS (
SELECT 1
UNION ALL
SELECT 1 + val FROM int_seq WHERE val  < 10)
SELECT * FROM int_seq;

【问题讨论】:

标签: mariadb common-table-expression


【解决方案1】:

这里没有限制,你只需要在语法方面反过来做:

INSERT cte_populated(id)
WITH  RECURSIVE int_seq AS (
SELECT 1 AS val
UNION ALL
SELECT val + 1
FROM int_seq
WHERE val  < 10
)
SELECT int_seq.val FROM int_seq;

更新:响应它仍然导致错误的声明,添加实际的客户端输出:

MariaDB [test]> CREATE TABLE `cte_populated` (
    ->   `id` int(11) DEFAULT NULL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.21 sec)

MariaDB [test]> INSERT cte_populated(id)
    -> WITH  RECURSIVE int_seq AS (
    -> SELECT 1 AS val
    -> UNION ALL
    -> SELECT val + 1
    -> FROM int_seq
    -> WHERE val  < 10)
    -> SELECT int_seq.val as id FROM int_seq;
Query OK, 10 rows affected (0.04 sec)
Records: 10  Duplicates: 0  Warnings: 0

MariaDB [test]> SELECT * FROM cte_populated;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
+------+
10 rows in set (0.00 sec)

MariaDB [test]> select @@version;
+----------------+
| @@version      |
+----------------+
| 10.2.9-MariaDB |
+----------------+
1 row in set (0.00 sec)

【讨论】:

  • 感谢您的回答,这也失败了,请参阅上面我更新的问题。
  • 如果它导致您出现语法错误,您可能没有使用您认为正在使用的服务器版本。检查版本并粘贴来自客户端的整个输出,类似于我添加到答案中的输出,但出现您遇到的错误。
猜你喜欢
  • 2020-03-11
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 2023-03-31
  • 2016-10-20
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多