首页 > 解决方案 > 别名为会话的mysql表?

问题描述

我知道您可以为查询的表提供别名,例如SELECT 1 FROM table AS t但是有没有办法为会话的表提供别名?

用例是我有一个“查询模式”,应该适用于 3 个不同的表。所以我只想使用表别名进行一个查询,然后告诉mysql“考虑到别名是table1,执行这个查询,然后考虑到别名是table2,执行相同的查询,......”

用例:

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

桌子

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 .... 并且使用 aCREATE 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$$

标签: mysql

解决方案


您可以做的一件事是切换到动态 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 中,您可以为数组中的每个元素调用此过程,将当前元素作为参数传递给函数。


推荐阅读