别名一个mysql表的会话?

时间:2018-10-03 09:53:40

标签: 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 ...这样的东西。并且使用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$$

1 个答案:

答案 0 :(得分:0)

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