为MySql中的视图生成唯一的长ID

时间:2012-11-29 08:50:47

标签: mysql hibernate view auto-generate

我查看了三张桌子。它有6列如下:

ID | NAME | PRINCIPAL_ID | DESCRIPTION | GROUP_ID | TYPE

当我使用hibernate从数据库中检索数据时,我必须将ID列放在此视图中。问题是,我无法生成唯一的ID,这似乎是hibernate正确加载数据所必需的。

如何在此视图中的每一行都有唯一的ID?

也许这会有所帮助,我不确定PRINCIPAL_IDGROUP_ID的组合可以创建一个唯一的ID。这三个都是Long

2 个答案:

答案 0 :(得分:6)

更新:如果您坚持将其作为数字,请按以下方式创建您的视图:

SELECT
(@rownum:=@rownum + 1) AS rownumber,
yourTable.*
FROM
yourTable
, (SELECT @rownum:=0) r

但那确实如此 - 没有其他可能性了。像我在评论中所说的那样将rownumber转换为long,如果它确实必须是long

或者在procedure

DELIMITER $$
CREATE PROCEDURE selectFromWhatever()
BEGIN
SELECT
(@rownum:=@rownum + 1) AS rownumber,
yourTable.*
FROM
yourTable
, (SELECT @rownum:=0) r;
END $$
DELIMITER ;

然后用

获得结果
CALL selectFromWhatever()

原始回答:

来自MySQL手册:

<强> UUID()

  

返回根据生成的通用唯一标识符(UUID)   “DCE 1.1:远程过程调用”(附录A)CAE(通用应用程序   环境)The Open Group于10月发布的规范   1997年(文件号C706,   http://www.opengroup.org/public/pubs/catalog/c706.htm)。

     

UUID被设计为在空间和全球范围内唯一的数字   时间。对UUID()的两次调用预计会产生两种不同的调用   值,即使这些调用是在两台独立的计算机上执行的   彼此没有联系。

     

UUID是由utf8字符串5表示的128位数字   aaaaaaa -bbbb-cccc-dddd-eeeeeeeeeeee格式的十六进制数字:

     

前三个数字是从时间戳生成的。

     

第四个数字保留时间唯一性,以防时间戳值失去单调性(例如,由于日光   节省时间)。

     

第五个数字是提供空间唯一性的IEEE 802节点号。如果后者不是,则替换随机数   可用(例如,因为主机没有以太网   卡,或者我们不知道如何找到一个的硬件地址   操作系统上的界面)。在这种情况下,空间的唯一性   无法保证。然而,碰撞应该非常低   概率。

     

目前,只在FreeBSD和Linux上考虑接口的MAC地址。在其他操作系统上,MySQL使用了   随机生成48位数。

     

的MySQL&GT; SELECT UUID();            - &GT; '6ccd780c-巴巴-1026-9564-0040f4311e29'

     

警告

     

虽然UUID()值是唯一的,但它们不是唯一的   必然是不可思议或不可预测的。如果不可预测的话   必需的,UUID值应该以其他方式生成。注意

     

UUID()不适用于基于语句的复制。

另一种方式是使用CONCAT()来构建您的唯一ID。

SELECT CONCAT(PRINCIPAL_ID, '-', GROUP_ID) AS myUniqueID
FROM yourTable

答案 1 :(得分:1)

替代方法是使用 ROW_NUMBER() OVER ()

SELECT ROW_NUMBER() OVER () AS ROW_NUM ... COLUMN... FROM TABLE