在MySQL中使用while建表,报错

在数据库中使用while循环,代码不知道出现什么问题。
代码

img


报错

img


希望有人可以解决一下谢谢。

回答引用ChatGPT:
逻辑错误:您正在检查表是否存在,如果不存在,则创建表。但是,您的代码只检查表是否存在,而不检查表是否不存在。这意味着如果表已经存在,它会跳过创建表的部分。正确的代码应该是:

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tablename) THEN
SET @sql = CONCAT('CREATE TABLE ', @tablename, ' (name varchar(20), num varchar(20), app1 varchar(20), applusetime float(10), app2 varchar(20), app2usetime float(10), app3 varchar(20), app3usetime float(10))');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;

请尝试使用这些更正后的代码并查看是否成功。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在MySQL中,CREATE TABLE语句不支持使用while等循环语句。您可以使用其他语句来创建表,请检查您的代码是否存在其他问题。

以下是一个示例的CREATE TABLE语句,可以用来创建一个名为test的表:

CREATE TABLE test (
    id INT PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    age INT NOT NULL
);

如果您使用的CREATE TABLE语句与此示例类似,但仍无法正常工作,则可能是您的代码中存在其他问题,请提供更多详细信息以便我们进行帮助。
如果我的回答解决了您的问题,请采纳!

动态sql在procedure中可以实现,具体如下:(语句在存储过程中不会报错,直接执行报错。)

img

while循环语句只能在存储过程或函数中使用,不能在普通的SQL语句中使用。

可以使用存储过程:

# 定义存储过程
DELIMITER $$
CREATE PROCEDURE create_table_batch()
BEGIN
    # 定义循环次数 
    SET @i = 1;
    SET @tablename = ''; 
    SET @sql = ''; 
     
    WHILE @i <= 31 DO
        SET @tablename = CONCAT('day', CAST(@i AS CHAR));
        IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tablename) THEN 
            SET @sql = CONCAT('CREATE TABLE ', @tablename,'(
                name VARCHAR(20), 
                num VARCHAR(20), 
                app1 VARCHAR(20), 
                applusetime FLOAT, 
                app2 VARCHAR(20), 
                app2usetime FLOAT, 
                app3 VARCHAR(20), 
                app3usetime FLOAT 
            )');
            PREPARE stmt FROM @sql; 
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt; 
        END IF;
        SET @i = @i + 1; 
    END WHILE;
END$$
DELIMITER;

# 调用存储过程
call create_table_batch();

亲测有效,如果解决问题,望采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^该回答引用ChatGPT
根据报错信息可以看出,MySQL不支持在CREATE TABLE语句中使用while循环。在创建表时,只能定义列名和列属性,而不能使用任何控制语句或数据操作语句。

如果想要在MySQL中批量生成数据,可以使用INSERT INTO语句配合循环实现。代码可以修改如下:

sql
CREATE TABLE IF NOT EXISTS goods (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20),
price INT
);

SET @i = 1;
WHILE @i <= 10 DO
INSERT INTO goods (name, price) VALUES ('商品' + @i, @i * 100);
SET @i = @i + 1;
END WHILE;


这段代码首先创建一个名为goods的表,然后使用循环向表中插入10条数据,数据中包含商品名称和商品价格。

注意:需要将@i的值初始化为1,否则循环不会执行;循环结束时需要将@i的值增加1,否则会一直插入第一条数据。