我有两个基表"tutorials_tb2","tutorials_tbl",我正在尝试以"tutorials_tb2_new","tutorials_tbl_new"的身份从这些表中创建两个新表,这样tutorials_tb2将成为tutorials_tb2_new的源,类似地,tutorials_tbl将成为tutorials_tbl_new的源
我正在尝试使用JSON_*方法创建一个MySQL函数,将新的和原来的表作为数组
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();在执行的时候,我得到了下面的错误
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>发布于 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语句执行。但是你不能在存储函数中做到这一点。
SQL prepared语句(PREPARE、EXECUTE、DEALLOCATE PREPARE)可以在存储过程中使用,但不能在存储函数或触发器中使用。因此,存储函数和触发器不能使用动态SQL (在动态SQL中,将语句构造为字符串,然后执行它们)。
实际上,通过使用存储函数和JSON,您会使这项任务变得非常困难。
只需编写循环遍历要创建的表名的应用程序或脚本,将DDL语句格式化为包含表名的字符串,然后执行DDL语句。
下面是一个Python的例子:
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。
https://stackoverflow.com/questions/70204523
复制相似问题