首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用LIKE从多个表创建多个表作为源,使用数组

问尝试使用LIKE从多个表创建多个表作为源,使用数组
EN

Stack Overflow用户
提问于 2021-12-02 18:14:35
回答 1查看 17关注 0票数 0

我有两个基表"tutorials_tb2","tutorials_tbl",我正在尝试以"tutorials_tb2_new","tutorials_tbl_new"的身份从这些表中创建两个新表,这样tutorials_tb2将成为tutorials_tb2_new的源,类似地,tutorials_tbl将成为tutorials_tbl_new的源

我正在尝试使用JSON_*方法创建一个MySQL函数,将新的和原来的表作为数组

代码语言:javascript
复制
DELIMITER //
CREATE FUNCTION example()
BEGIN
  
DECLARE _counter INT DEFAULT 0;
DECLARE _value varchar(50);

SET @origTables = '["tutorials_tb2","tutorials_tbl"]';
SET @newTables = '["tutorials_tb2_new","tutorials_tbl_new"]';

WHILE _counter < JSON_LENGTH(@origTables) DO

CREATE TABLE JSON_VALUE(@newTables, CONCAT('$[',_counter,']')) LIKE JSON_VALUE(@origTables, CONCAT('$[',_counter,']'))
SET _counter = _counter + 1;

END WHILE;
END //

DELIMITER ;

SELECT example();

在执行的时候,我得到了下面的错误

代码语言:javascript
复制
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN

DECLARE _counter INT DEFAULT 0;
DECLARE _value varchar(50);

SET @origT' at line 2
MySQL>
EN

回答 1

Stack Overflow用户

发布于 2021-12-02 18:26:01

语法错误的原因是存储函数在BEGIN之前需要一个RETURNS <type>子句。查看语法文档:https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html

您将遇到的下一个问题是,JSON表达式返回一个字符串,而不是标识符。您不能使用CREATE TABLE <string-expression>并使表达式的结果成为表名。

您必须将字符串表达式插入到字符串中,并将该字符串作为动态SQL语句执行。但是你不能在存储函数中做到这一点。

https://dev.mysql.com/doc/refman/8.0/en/stored-program-restrictions.html#stored-routine-sql-restrictions说:

SQL prepared语句(PREPARE、EXECUTE、DEALLOCATE PREPARE)可以在存储过程中使用,但不能在存储函数或触发器中使用。因此,存储函数和触发器不能使用动态SQL (在动态SQL中,将语句构造为字符串,然后执行它们)。

实际上,通过使用存储函数和JSON,您会使这项任务变得非常困难。

只需编写循环遍历要创建的表名的应用程序或脚本,将DDL语句格式化为包含表名的字符串,然后执行DDL语句。

下面是一个Python的例子:

代码语言:javascript
复制
import mysql.connector

cnx = mysql.connector.connect(...)

cursor = cnx.cursor()

for tablename in ["tutorials_tb2","tutorials_tbl"]:
    sql = f"CREATE TABLE `{tablename}_new` LIKE `{tablename}`"
    cursor.execute(sql)

cnx.close()

我很少在MySQL中使用存储的例程或JSON。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70204523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档