我有一个删除所有表的脚本。
SET FOREIGN_KEY_CHECKS = 0;
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
FROM information_schema.tables
WHERE table_schema = 'mydb';
SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
只有至少一个表存在时,它才能完美运行一次。 第二次运行给了我一个错误:
您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“NULL”附近使用正确的语法SQL.sql 9 1
我正在尝试使用IF语句,但它仍然不起作用:
IF @tables IS NOT NULL THEN
SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在“if @tables IS NOT NULL THEN”附近使用正确的语法 第1行的SET @tables = CONCAT('DROP TABLE',@ table)'SQL.sql 8 1
在这种情况下使用IF的正确方法是什么?
答案 0 :(得分:2)
当您为会话变量分配值并在查询中使用相同时,然后
它的价值将取代占位符。由于这个原因,
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
成为
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO NULL
完全没有任何意义。
相反,您应该直接使用变量而不预先设置其值 所以不要使用
SET @tables = NULL;
其次,语句块不能由数据库引擎直接编译,除非它们的作用域是在块下定义的。这通常使用存储过程或触发器完成。如果在某个程序中,它们必须介于BEGIN
和END
之间。
以下是错误的:
IF @tables IS NOT NULL THEN
SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
您应该遵循为存储过程定义的语法以使用范围变量。
请参阅我对类似问题的回答,如下所述: