使用自动递增id列创建MySQL视图

时间:2010-05-11 07:22:08

标签: mysql view

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

我试过

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

但这在视图中不起作用。

6 个答案:

答案 0 :(得分:12)

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

来自MySQL Manual

  

视图定义受制于   以下限制:SELECT   声明不能参考系统或   用户变量。

答案 1 :(得分:6)

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

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

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

上的文档

因此你可以创建一个这样的视图:

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

答案 2 :(得分:1)

试试这个,

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 - &gt; meta_id [3,5,6,10,2,11]   哪个会出现 在视图 view_wp_postmeta - &gt; view_id [6,5,4,3,2,1]

答案 3 :(得分:1)

尝试一下

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

答案 4 :(得分:0)

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

我的用例是“银行操作”视图,其中涉及将“存款”表中的记录与“取款”表中的记录合并,如最佳做法所建议的那样,每个记录都包含一个自动数字id列。 / p>

所以,我有两种操作类型

  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

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

答案 5 :(得分:0)

这有效:

SET @autoIncrementNumber = 0;

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