Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建具有自动递增id列的MySQL视图_Mysql_View - Fatal编程技术网

创建具有自动递增id列的MySQL视图

创建具有自动递增id列的MySQL视图,mysql,view,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` ... 但这在视图中不起作用。对不起,您不能在视图中自动递增,但可以在存储过程中自动递增 从: 视图定义受 以下限制:选

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

我试过了

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

但这在视图中不起作用。

对不起,您不能在视图中自动递增,但可以在存储过程中自动递增

从:


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

试试这个

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_postemta表中的WordPress meta_id=AUTO_INCREMENT中,我为此创建了一个视图,其中视图id的行为类似于描述顺序中的AUTO_INCREMENT

比如说,, 在表wp_Posteta中-> 元id[3,5,6,10,2,11] 哪个会出现 在视图中\u wp\u postmeta->
视图id[6,5,4,3,2,1]

我知道这个问题很老了,但为了防止其他人遇到这个问题,还有另一个选择

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

您可以使用UUID函数,该函数为您提供唯一的字母数字标识符。查看以下位置的文档:

因此,您可以创建如下视图:

Create view my-view AS
Select UUID() as 'id', t.name, t.value
from table t
....
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
试试这个

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

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

我的用例是一个银行操作视图,它涉及到将存款表中的记录与取款表中的记录合并,正如最佳实践所建议的,每个记录都包含一个自动数字id列

所以,我有两种操作类型

押金 撤回 如果在我看来,以1开头的每一行都是存款,以2开头的每一行都是取款,那么我认为它在这种情况下是有效的。因此,为了将两者连接起来,您最好在操作类型本身中添加一些零,因此,如果您添加70,并且假设此取款的自动数字id为33,那么1将变为10000000

然后你去: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 view my-view AS
Select UUID() as 'id', t.name, t.value
from table t
....
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

希望你喜欢。实际上是这样。

此解决方案有一个主要缺点:每次访问视图时UUID都会更改。视图定义受以下限制:*SELECT语句不能在FROM子句中包含子查询。*SELECT语句不能引用系统或用户变量。*SELECT语句无法引用准备好的语句参数。。。有没有关于如何使用存储过程执行此操作的线索?简单且非常有用。它完全符合问题的要求。这应该是可以接受的答案!