【问题标题】:Creating a MySQL view with an auto-incrementing id column创建具有自动递增 id 列的 MySQL 视图
【发布时间】:2011-02-18 00:31:19
【问题描述】:

我有一个 MySQL 数据库,从中创建了一个视图。是否可以为视图中的每一行添加一个自动递增的 id?

我试过了

CREATE ALGORITHM=UNDEFINED DEFINER=`database_name`@`%` SQL SECURITY DEFINER VIEW `MyView` AS 
set @i = 0;
select  @i:=@i+1 as `id`
        ...

但这在视图中不起作用。

【问题讨论】:

    标签: mysql view


    【解决方案1】:

    我知道这个问题很老,但万一其他人遇到这个问题,还有另一种选择。

    重要提示:只要自动增量不是很重要,此替代方案就有效,因此您只需要视图行的唯一标识符:

    您可以使用为您提供唯一字母数字标识符的 UUID() 函数。查看mysql-reference-manual 的文档

    因此您可以创建这样的视图:

    Create view my-view AS
    Select UUID() as 'id', t.name, t.value
    from table t
    ....
    

    【讨论】:

    • 此解决方案有一个主要缺点:每次访问视图时 UUID 都会发生变化。
    【解决方案2】:

    抱歉 - 您不能在 VIEW 中自动递增(不过您可以在存储过程中执行此操作)。

    来自MySQL Manual:

    视图定义受制于 以下限制: SELECT 语句不能引用系统或 用户变量。

    【讨论】:

    • 任何线索如何用存储过程做到这一点?
    【解决方案3】:

    试试这个,

    create view view_st as
    select row_number() over (order by column_st) id, column_st 
    from table_st;
    

    【讨论】:

    • 简单且非常有用。它完全符合问题的要求。
    【解决方案4】:

    试试这个,

    CREATE VIEW view_wp_postmeta AS(
    SELECT (
      SELECT count( meta_id ) +1
      FROM wp_postmeta 
      AS vtmp     
      WHERE vtmp.meta_id < pm.meta_id
    ) AS vtmp_id, pm. *
    FROM wp_postmeta AS pm
    ORDER BY pm.meta_id DESC
    )
    

    在 wp_postmeta TABLE 中的 WordPress meta_id = AUTO_INCREMENT 中,我为此创建了一个 VIEW,其中 view_id 的行为类似于 DESC 顺序中的 AUTO_INCREMENT。

    例如, 在 TABLE wp_postmeta -> meta_id [3,5,6,10,2,11] 这会出现 在 VIEW view_wp_postmeta -> view_id [6,5,4,3,2,1]

    【讨论】:

    • 视图定义受以下限制: * SELECT 语句不能在 FROM 子句中包含子查询。 * SELECT 语句不能引用系统或用户变量。 * SELECT 语句不能引用准备好的语句参数。 ...”
    【解决方案5】:

    我一直在寻找与您相同的东西,但得出的结论是,我正在寻找一种在视图中唯一且稳定地识别记录的方法。

    我的用例是一个“银行操作”视图,其中涉及将“存款”表中的记录与“取款”表中的记录合并,按照最佳实践建议,每个记录都包含一个自动数字 id 列。

    所以,我有两种操作类型

    1. 存款
    2. 提现

    我认为,如果我认为以 1 开头的每一行都是存款,如果以 2 开头的每一行都是取款,那么我认为对于这种情况是有效的。因此,要将两者连接起来,您最好在操作类型本身中添加一些零,例如,1 变为 10000000(如果添加 7 个 0)并假设此取款的自动数字 id 为 33。

    然后你去:10000000+33 = 10000033 因此,如果你有一个 id 为 33 的提款记录,它不应该与我们的存款发生冲突(只要我们添加了足够的 0),因为它会变成类似:20000033。

    明白了吗?好的,现在运行这个:

    DELIMITER $$
    CREATE FUNCTION renderVirtualId(part1 INT, part2 INT, len INT) RETURNS bigint(20) unsigned
        NO SQL
    BEGIN
    return part1*POW(10,len)+part2;
    end$$
    DELIMITER;
    

    然后你像这样编译你的视图:

    CREATE OR REPLACE VIEW v_balance AS
    SELECT renderVirtualId(1,id,10) as id,amount,account,datetime FROM deposits
    UNION
    SELECT renderVirtualId(2,id,10) as id,-amount,account,datetime FROM withdrawals
    ORDER BY datetime DESC
    

    希望你喜欢它。我确实做到了。

    【讨论】:

      【解决方案6】:

      这行得通:

      SET @autoIncrementNumber = 0;

      SELECT @autoIncrementNumber:=@autoIncrementNumber + 1 AS Num, columnName FROM 视图名称 限制 0,8;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        • 1970-01-01
        相关资源
        最近更新 更多