代码之家  ›  专栏  ›  技术社区  ›  Artem Russakovskii

mysql函数返回要在查询中使用的表名

  •  0
  • Artem Russakovskii  · 技术社区  · 17 年前

    我可以使用mysql函数或过程返回可以在查询中使用的表名吗?

    有点像

    SELECT * FROM get_db_table_name(2342352412);

    哪里 get_db_table_name() 是一个用户定义的函数,它接受 user_id 作为参数并返回该用户所在的db.table。我不能这样做,因为mysql抱怨语法问题(我猜是因为我必须为函数定义一个返回类型,我试着用 VARCHAR(30) 这是错误的或不可能的)。那么,这有可能吗?

    故事是我有几个数据库,基本上是碎片。我们叫他们 user_1 , user_2 等。

    我还有一张桌子,比如说 emails 包含 用户标识 表中的s user_1.users , user_2.users 等。

    因为我知道一种通过查看id来计算id来自哪个表的方法,所以我只需要一个函数来接受输入并返回要使用的db.table名称。

    谢谢您!

    p.s.我想使用上面的select查询作为一个视图定义,通过在适当的表上进行连接,将用户名从适当的db/表中带出。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Zed    17 年前

    你可以使用 prepared statements 为此,例如:

    ....
    SET @tbl = 'nameofmytable';
    SET @sql = CONCAT( 'SELECT * FROM ', @tbl );
    EXECUTE @sql;
    ...
    
        2
  •  0
  •   Svetlozar Angelov    17 年前

    定义视图时 必须指定表 . 你不能定义“从任何需要的地方选择”的视图…

    视图定义是 冻结的 在创建时,因此对基础表的更改不会影响视图定义。例如,如果视图在表上定义为select*,则以后添加到表中的新列不会成为视图的一部分。

    你必须指定我的视图在这个,这个和这个表上。看看这个,您不能从func(id)中选择*因为您不能指定这个函数的结果是什么(取决于输入参数)。

    select的语法是

    从表参考中选择*

    “动态”选择的唯一方法是使用动态sql,@zed回答了什么……

    如果我的回答不完整,我很抱歉,但我不知道你的问题的细节。祝你好运!

        3
  •  0
  •   Vince Bowdren    16 年前

    参数化表名为 considered to be usually because of bad database design . 是否真的不可能将同一类型的所有实体(在本例中是您的用户)放在一个表中?

    推荐文章