我查看了三张桌子。它有6列如下:
ID | NAME | PRINCIPAL_ID | DESCRIPTION | GROUP_ID | TYPE
当我使用hibernate
从数据库中检索数据时,我必须将ID
列放在此视图中。问题是,我无法生成唯一的ID
,这似乎是hibernate
正确加载数据所必需的。
如何在此视图中的每一行都有唯一的ID?
也许这会有所帮助,我不确定:PRINCIPAL_ID
和GROUP_ID
的组合可以创建一个唯一的ID。这三个都是Long
。
答案 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