4

我对三张桌子有一个看法。它有 6 列,如下所示:

ID | NAME | PRINCIPAL_ID | DESCRIPTION | GROUP_ID | TYPE

当我hibernate用来从数据库中检索数据时,我不得不将ID列放在这个视图中。问题是,我无法生成正确加载数据ID所需的唯一值。hibernate

如何在此视图中为每一行设置唯一 ID?

也许这会有所帮助,我不确定PRINCIPAL_ID和的组合GROUP_ID可以制作一个唯一的 ID。这三个都是Long

4

2 回答 2

9

更新:当您坚持将其作为数字时,请像这样创建您的视图:

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

但事实就是如此——没有其他可能性了。就像我在评论中所说的那样投射 rownumber long,如果真的,真的必须是long.

或者在一个过程中:

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

然后得到结果

CALL selectFromWhatever()

原答案:

来自 MySQL 手册:

UUID()

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

UUID 被设计为在空间和时间上全球唯一的数字。对 UUID() 的两次调用预计会生成两个不同的值,即使这些调用是在未相互连接的两台独立计算机上执行的。

UUID 是一个 128 位数字,由五个十六进制数字组成的 utf8 字符串表示,格式为 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee:

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

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

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

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

mysql> 选择 UUID(); -> '6ccd780c-baba-1026-9564-0040f4311e29'

警告

尽管 UUID() 值旨在是唯一的,但它们不一定是不可猜测或不可预测的。如果需要不可预测性,则应以其他方式生成 UUID 值。笔记

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

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

SELECT CONCAT(PRINCIPAL_ID, '-', GROUP_ID) AS myUniqueID
FROM yourTable
于 2012-11-29T09:49:11.603 回答
1

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

SELECT ROW_NUMBER() OVER () AS ROW_NUM ... COLUMN... FROM TABLE
于 2021-01-20T02:19:17.100 回答