为会话别名mysql表?

7gs2gvoe  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(317)

我知道你可以为一个查询表提供一个别名,比如 SELECT 1 FROM table AS t 但是有没有一种方法可以为会话的表提供别名呢?
用例是我有一个“查询模式”,应该应用于3个不同的表。所以我只想使用一个表别名进行一个查询,然后告诉mysql“执行这个查询时考虑到别名是table1,然后执行相同的查询时考虑到别名是table2,…”
用例:

INSERT INTO aliasedTable (id, value) VALUES (1,1)

table

CREATE TABLE table1 (id INT UNSIGNED, value TINYINT UNSIGNED)
CREATE TABLE table2 (id INT UNSIGNED, value TINYINT UNSIGNED)
CREATE TABLE table3 (id INT UNSIGNED, value TINYINT UNSIGNED)

“假定”语法

ALIAS table1 AS aliasedTable;
INSERT INTO aliasedTable (id, value) VALUES (1,1)
ALIAS table2 AS aliasedTable;
INSERT INTO aliasedTable (id, value) VALUES (1,1)
ALIAS table3 AS aliasedTable;
INSERT INTO aliasedTable (id, value) VALUES (1,1)

我想到的是,制作一个可更新的 VIEW 但是没有这样的东西 CREATE TEMPORARY VIEW ... . 以及使用 CREATE TEMPORARY TABLE aliasedTable AS (SELECT * FROM table1) 将创建一个表副本,而不是在原始表中插入。
有什么建议吗?
请注意,我在php代码中有这样的情况,但在一个过程中也有这样的情况:

<?php
$query = 'INSERT INTO aliasedTable (id, value) VALUES (1,1)';
foreach (array('table1', 'table2', 'table3') AS $t) {
    // Ideally, I would like to avoid string concat here and tell MySQL
    // something like 'ALIAS :placeholder AS aliasedTable', ['placeholder' => $t]
    $pdo->query('ALIAS ' . $table1 . ' AS aliasedTable');
    $pdo->query($query);
}

SET @tables := '["table1","table2","table3"]';
SET @i := JSON_LENGTH(@tables) - 1;
WHILE (@i >= 0) DO 
    SET @table := JSON_UNQUOTE(JSON_EXTRACT(@tables, CONCAT('$[', @i, ']')));
    ALIAS @table AS aliasedTable;
    CALL inserting();
    SET @i := @i - 1;
END WHILE;

哪里

CREATE PROCEDURE inserting() 
BEGIN
    INSERT INTO aliasedTable (id, value) VALUES (1, 1);
END$$
mgdq6dx1

mgdq6dx11#

您可以做的一件事是切换到动态sql语句,并将表名作为输入参数传递给 inserting 功能:

CREATE PROCEDURE inserting( IN tbl_name VARCHAR(25) )
BEGIN
SET @stmt = CONCAT('INSERT INTO ', tbl_name, ' (id, value) VALUES (1, 1)');
 PREPARE stmt FROM @stmt;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt;
END

根据您的呼叫,这将向相应的表插入数据。例如:

CALL inserting('table1');

将执行以下语句:

INSERT INTO table1 (id, value) VALUES (1,1);

然后,可以从php为数组中的每个元素调用此过程,将当前元素作为参数传递给函数。

相关问题