【问题标题】:How to extract uuid inserted into a row as a primary key via a trigger如何通过触发器提取插入行中的uuid作为主键
【发布时间】:2012-02-17 04:21:57
【问题描述】:

考虑表格:

CREATE TABLE `information` (
    `id` char(36) NOT NULL,
    `data` text NOT NULL,
    PRIMARY KEY (`id`)
)

使用触发器:

CREATE TRIGGER `information_uuid_ins_trg` 
BEFORE INSERT ON information 
FOR EACH ROW
BEGIN
    SET NEW.id = UUID();
END;

我想做的,是知道之前插入语句使用的 id。

INSERT INTO information (data) VALUES ('[some data]')

给定一个复制的主-主环境,其中 [某些数据] 不能保证是唯一的。显然,last_insert_id() 不能使用,因为该字段不是 auto_increment 字段。使用 LAST_INSERT_ID(UUID( )) 添加临时表的更新将不起作用,因为 LAST_INSERT_ID(expr) 需要一个整数值作为 expr。在 OracleRDBMS 中,我会使用:

INSERT INTO information 
(data) values ('[some data]') 
RETURNING id INTO var_id

或者我会使用 Microsoft SQL Server / Postgres:

INSERT INTO information 
(data) values ('[some data]') 
OUTPUT INSERTED.*

这将全部从运行在一组网络服务器上的 PHP 前端调用。

关于如何在 mysql 中返回 uuid pk 有什么想法吗?

【问题讨论】:

    标签: mysql primary-key replication uuid


    【解决方案1】:

    由于 MySQL 似乎没有任何内置功能可以帮助您,很遗憾我想不出比这个“hack”更好的东西了;

    DELIMITER //
    
    CREATE TRIGGER `information_uuid_retrieve` 
    AFTER INSERT ON information 
    FOR EACH ROW 
    BEGIN 
      SET @INSERT_ID=NEW.id; 
    END;//
    
    DELIMITER ;
    
    INSERT INTO information (data) VALUES ('olle');
    
    SELECT @INSERT_ID;
    +--------------------------------------+
    | @INSERT_ID                           |
    +--------------------------------------+
    | f42f4044-58d0-11e1-8f90-93738648d450 |
    +--------------------------------------+
    

    【讨论】:

    • 为什么需要两步流程?为什么不 SET @INSERT_ID = NEW.ID ?
    • @MichaelMacDonald 好点,我之前收到一个关于没有定义语句的错误,但是当我现在再次尝试时,它似乎工作得很好。用更简单的版本更新答案。
    • 我已经在我们的环境中对此进行了测试,它将满足我们的需求。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 2019-01-22
    • 1970-01-01
    • 2020-08-29
    • 2012-08-03
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多