因此,我一直使用视图而不是结果查询作为项目中的实体,我知道我并不孤单,所以我的问题是:
使用视图时,您用作和@Id的用途是什么?有时候,这个问题的答案是微不足道的,但是有时候当您没有一个引人注目的独特领域时,你们会做什么?
现在,我在特定视图中包括了我需要的更多字段,因此我可以混合使用多个唯一字段,并且我在每个字段上都使用了@Id注释,到目前为止,它的工作一直很好。
似乎是上下文,我一直在问自己是否有更标准的方法。
我认为没有标准的方法,但这里的方法似乎值得尝试。
想法是为 view 动态生成唯一的“id”值(类似于 rownum )。来自Create a view with column num_rows - MySQL 的函数的一点修改版本(进行修改是为了重置 rownum):
delimiter //
CREATE FUNCTION `func_inc_var_session`( val int) RETURNS int
NO SQL
NOT DETERMINISTIC
begin
if val = 0 THEN set @var := -1; end if;
SET @var := IFNULL(@var,0) + 1;
return @var;
end
//
Run Code Online (Sandbox Code Playgroud)
假设我们有一个视图定义(出于说明目的而过于简化)
CREATE VIEW v_test1
SELECT a.field1
FROM test_table a
Run Code Online (Sandbox Code Playgroud)
将其修改为
CREATE VIEW v_test1
SELECT a.field1, func_inc_var_session(0) as rownum
FROM test_table a
Run Code Online (Sandbox Code Playgroud)
会做这项工作;但是,select * from v_test
在一个会话中多次运行将为您提供连续的 rownum,例如,第一次以 1 开头,第二次以视图中的记录数开头,等等。
要重置 rownum 我创建另一个视图(由于 mysql 视图限制 - 它不能有子查询FROM
):
CREATE VIEW v_reset AS SELECT func_inc_var_session(1) ;
现在我们可以做
CREATE VIEW v_test1
SELECT a.field1, func_inc_var_session(0) as rownum
FROM test_table a, v_reset
Run Code Online (Sandbox Code Playgroud)
(首先处理的 FROM 子句,func_inc_var_session(1)
在查询期间只会执行一次,因此会重置 rownum)。
我希望它有帮助。
归档时间: |
|
查看次数: |
418 次 |
最近记录: |