mysql - 创建表并使用变量插入
问题描述
我想创建一个表并插入仅更改变量名的数据。但是,它创建了一个名为 @myId 的表,而不是变量的值。我也试图删除 `` 但我得到了一个 sql 错误。
set @myId = "tabletest";
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
CREATE TABLE `@myId` (
`id` int(10) NOT NULL,
`position` int(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `@myId` (`id`, `position`) VALUES
(1, 1);
解决方案
我不建议您这样做。表名不应该来自变量。但是,您确实提出了一个有效的问题,如果您要这样做,您需要动态 SQL:
SET @sql = 'CREATE TABLE @myId (id int(10) NOT NULL, position int(10) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1;';
SET @sql = REPLACE(@sql, '@myId', 'tabletest');
PREPARE ct FROM @sql;
EXECUTE ct;
DEALLOCATE PREPARE ct;
SET @sql = 'INSERT INTO @myId (id, position) VALUES (1, 1);';
SET @sql = REPLACE(@sql, '@myId', 'tabletest');
PREPARE st FROM @sql;
EXECUTE st;
DEALLOCATE PREPARE st;
然后你可以执行:
SELECT * FROM tabletest;
请注意,如果您想在 中使用@myId
,则SELECT
需要更多动态 SQL:Yucch!
通常正确的解决方案只是一个表格,您可以在其中插入带有标识符的行。然后,您可以在完成后根据需要删除这些行(或使它们无效)。
这是一个 db<>fiddle。
推荐阅读
- mysql - 带有 nginx 服务器和 AWS RDS 的 Laravel 出现“连接太多”错误
- rust - 插入式编译器替换找不到 std crate
- c++ - 本地 QEventLoop 是如何工作的
- matlab - Psychtoolbox DrawText 导致很多错过的翻转(Matlab)
- r - Sys.time() 和 format() 在 R 中的桌面和 docker 图像上显示不同的结果
- angular - Angular 中可重用的自定义组件列表
- mysql - 带有条件的 SQL 查询和 CASE WHEN 中的 GROUP BY
- php - Laravel - 我如何显示已排序的内容
- informix - Informix 5.10 安装程序或兼容版本
- dom - 是否可以在 DOM 元素上使用 WebGl/GLSL 着色器?