mysql_insert_id或类似的东西,以返回最后一个mysql UUID()

时间:2011-01-14 01:32:15

标签: mysql uuid

如何返回最后生成的UUID()(主键) - 是否有类似mysql_insert_id的内容?

uuidtable

primary key: uuid uuid()
id_u (index): integer

多个id_u与主键uuid()匹配

插入:insert into uuidtable (uuid,id_u) values (uuid(),id)

其中id是一个数字,当然,uuid是通过

 uuid 

转义的

6 个答案:

答案 0 :(得分:1)

给自己写一个这样的触发器:

CREATE TRIGGER ai_uuidtable
AFTER INSERT ON uuidtable
FOR EACH ROW
SET @last_uuid = NEW.uuid;

插入后:

SELECT @last_uuid

MySQL的用户定义变量是特定于连接的,因此您不必担心获得另一个连接@last_uuid

值得关注的一点是:如果您使用uuid作为密钥,为了使其具有最高性能,应将其存储为16字节binary字段而不是36字节{ {1}}字段。如果你真的想使用MySQL的char算法,请删除连字符并UUID()

UNHEX()

除此之外:PostgreSQL实际上有一个UUID数据类型(但没有内置的UNHEX( REPLACE( UUID(), '-', '' ) ) 函数),这意味着您不必重新UUID()字段以避免获取二进制终端上的垃圾HEX()

答案 1 :(得分:0)

我不确定它甚至可以用mysql做。

我能得到的唯一明显的解决方案是在单独的查询中生成UUID(),然后插入具有已知id的记录。

答案 2 :(得分:0)

Richard's solution开始,您实际上可以使用触发器来获得您希望从常规自动增量ID中获得的所有功能:

CREATE TRIGGER `tablename_newid` 
BEFORE INSERT ON `tablename` 
FOR EACH ROW 
BEGIN 
    SET NEW.table_id = UNHEX(REPLACE(UUID(),'-',''));
    SET @last_uuid = NEW.table_id; 
END

这将允许您在不手动插入UUID主键的情况下执行插入,并自动将自动生成的ID存储到@last_uuid变量中。要阅读它,只需像以前一样SELECT @last_uuid

Richard的答案使用AFTER INSERT,这避免了BEFORE INSERT的问题,即使行插入失败,也会设置UUID变量。我没有测试过这种方法 - 虽然我觉得在正常情况下它会完全没问题但我想知道集群复制是否会出现问题。

性能注意事项:您会注意到我的UUID插入运行通过REPLACE()和UNHEX()将其存储为16字节的二进制字段 - 这只是普通INT主键的存储空间的4倍(并且仅是BIGINT的两倍,并且 比基于字符串的UUID密钥查询更快。

当查询和读取这样的二进制值时,MySQL函数HEX()UNHEX()将非常有用,将以十六进制表示法编写查询值(前面有0x)。< / p>

答案 3 :(得分:0)

我发现唯一确定的方法是将uuid存储在变量中。然后在插入查询中使用变量,如下所示:

DELIMITER \\
CREATE PROCEDURE AddUserLinkRole(uname VARCHAR(50), passwd VARCHAR (40), role VARCHAR(50))
    BEGIN
        DECLARE UserUuid VARCHAR(36);
        DECLARE UserRole VARCHAR(50);
        /*Now initiate UserUuid = uuid() value*/
        SET UserUuid = uuid();
        SELECT RoleID INTO UserRoleID FROM Roles WHERE Description = role;
        /*Because I initiated UserUuid = uuid(), I can now refer to it anytime I wish using my UserUuid variable*/
        INSERT INTO Users(UserID,UserName,Password,RoleID) VALUES (UserUuid,uname,MD5(passwd),UserRoleID);
    END \\
DELIMITER ;

我希望以上内容有道理..

答案 4 :(得分:0)

要获取/返回数据库生成的uuid,我们可以使用数据库变量:

SET @uuid=UUID();
INSERT INTO uuidtable (uuid,id_u) values (@uuid,$number);
SET @uuid = IF(ROW_COUNT(),@uuid,null);#way1
SELECT @uuid;#way1
#SELECT IF(ROW_COUNT(),@uuid,null) as uuid;#way2

我们在insert-query之前创建uuid并将其保存到'@uuid'。这允许我们使用它(对于其他表,作为外键)或返回其值,例如,在你的(php-)代码中使用它,重定向,调用或其他任何东西。

way1:在insert-query之后再次设置变量,具体取决于插入的成功。如果插入失败,我们的查询返回为null,所以我们可以在我们的应用程序中处理,并且我们避免使用我们认为它被使用的uuid,但从来没有。

way2:只需保存行/查询并让变量存在。我们的返回是干净的,但变量仍然在数据库的内存中。

这种方法的好处:我们可以将它发送到数据库一次并获得一次返回,如果我们首先运行select以获取uuid并在之后插入,我们可以通过db-driver-network获得潜在的双延迟-connection。

答案 5 :(得分:0)

对于特定的表,我想从无符号整数移动,将自动增量id更改为uuid_short()id。

桌子看起来像这样

CREATE TABLE IF NOT EXISTS `person` (
  `person_id` bigint(20) NOT NULL DEFAULT uuid_short(),
  `name` varchar(128) NOT NULL,
  `vorname` varchar(128) NOT NULL,
  `gender` char(1) NOT NULL DEFAULT 'u',
  PRIMARY KEY (`person_id`),
  KEY `gender` (`gender`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert查询是通过准备好的语句设置生成的,并绑定了所有值。

如果我这样做,则PDO :: lastInsertID始终为0(零),实际上,使用表中的适当键正确完成了更新

但是,如果我使用unsigned int:

 `person_id` int(20) UNSIGNED NOT NULL AUTO_INCREMENT,

一切正常,新创建的ID存储在lastInsertId

如果默认值为uuid_short(),是否可以找到最后创建的PK?

相关问题