【问题标题】:getting table name from a table and using the table name to access data从表中获取表名并使用表名访问数据
【发布时间】:2013-03-17 05:03:27
【问题描述】:

我想创建一个数据库,其中有一个存储在表中的表名列表。现在借助此列表,我可以访问其他表。

例如:-

Table name :- table_list (2 column i.e. table_name,table_id)
table_list attributes 
authentication 1 
basic_info 2 
contact 3

我可以使用 select 语句直接访问这些表,但我想使用 table_list 表访问它们,最好使用 select 语句。

我试过了

select * from (select table_name as x from table_list where id=2) as y

但无法获得正确的输出。

【问题讨论】:

  • 你想达到什么目的?在另一个表中存储表名有什么意义。如果出于安全目的,你可以创建视图并为用户提供有限的访问权限。
  • 对于我的项目,我已经创建了视图。但我想实现一些动态方法来从各种表中检索数据。此外,这种方法可以提供安全性,这是一个优点。

标签: mysql database select


【解决方案1】:

它被称为Prepared Statements,它们唯一的用途是当你想在一个请求中实现你提到的需求时。否则,您可以轻松地以编程语言检索表名并使用手头的数据创建下一条语句。以下是Prepared Statements 的工作原理:

SELECT table_name INTO @tbl FROM my_tables WHERE id = 1 LIMIT 1;
SET @sql := CONCAT('SELECT * FROM ', @tbl);
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

【讨论】:

  • 对不起,我没有时间测试它。你是对的,它不工作。我现在已经更新了它,所以它可以工作。谢谢指出。
  • SELECT getname.tbnm INTO @tbl FROM getname WHERE getname.id = 1 LIMIT 1; SET @sql := CONCAT('SELECT * FROM ', @tbl); PREPARE stmt1 FROM @sql; EXECUTE stmt1; @Mehran 我试过你的 give 声明,除了最后一个 DEALLOCATE PREPARE stmt1; 之外,一切都很完美。
  • DEALLOCATE 有什么问题?我自己试过了,效果很好!也许您的问题更像是它的作用?在这种情况下,我必须说它删除了先前创建的Prepared Statement,并且当您不再需要使用该语句时需要调用它。除此之外,我不知道解除分配可能会出现什么问题!
【解决方案2】:
TRY THIS

select * from (SELECT TABLE_NAME FROM TABLE_LIST WHERE ID=2)as y

【讨论】:

  • 此语句将从TABLE_LIST 中的TABLE_NAME 列返回值。这与 OP 发布的查询有何不同?
【解决方案3】:

表名(“标识符”)必须是发送给数据库的 SQL 文本的静态部分;标识符不能“即时”提供,无论是作为参数还是作为另一个 SQL 查询的结果。

要做你想做的事,你需要一个两步的方法。您可以使用一个(或多个)SQL 语句来获取您需要的标识符(表名、列名等),然后使用它来动态创建第二个 SQL 语句,作为字符串。

标识符(表名、列名)不能作为参数或“绑定变量”提供,它们必须是 SQL 文本的静态部分。

例如生成语句:

SELECT CONCAT('SELECT * FROM `',table_name,'` ORDER BY 1') AS stmt
  FROM table_list
 WHERE id = 2

(编码细节取决于您使用的语言。)

【讨论】:

    【解决方案4】:

    既然您确定要访问的表名是 x,只需使用查询检查这样的表是否存在,并将 x 用于将来的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多