在字段值为null时插入行后更新MySQL表

时间:2014-12-15 18:18:51

标签: mysql

我有一个MySQL表,它有一个自动递增的主要调用和一个UUID。两者都用作唯一ID,因为有两个表具有相似的对象,并且需要在两个表中都有唯一的标识符(并且可能还有更多的对象)。

所以表格如下:

table A
_______
ID int pk, ai
UUID varchar, uq
other columns....

应用程序将插入到此表中,但可能不会始终生成UUID。有时应用程序提供UUID,有时我需要MySQL来创建一个。

如何实现? - 我尝试过这个触发器:

CREATE TRIGGER trig_ains_aw_trckid 
    AFTER INSERT ON table_a 
    FOR EACH ROW
    begin 
        update table_a set UUID = (SELECT concat('k_', uuid())) where UUID is null;   
    end

现在我无法插入到表中,因为触发器似乎位于其前面:

  

无法在存储的函数/触发器中更新表'account_keywords'   因为它已被调用此存储的语句使用   功能/触发。

任何帮助都会得到最多的赞赏,并且对我的错误做出任何解释更是如此。如果没有说明显而易见的话,UUID显然应该保持不变...... 以前不需要使用触发器,我想我对它们知之甚少。在MS SQL中,这实际上非常简单!

谢谢,

克里斯

2 个答案:

答案 0 :(得分:0)

针对非空案例扩展this答案:

CREATE TRIGGER trig_ains_aw_trckid
  BEFORE INSERT ON table_a 
  FOR EACH ROW
  SET UUID = uuid() where UUID is null;

答案 1 :(得分:0)

怎么样:

CREATE TRIGGER trig_ains_aw_trckid 
    AFTER INSERT ON table_a 
    FOR EACH ROW
    begin 
        update table_a set UUID = (SELECT concat('k_', uuid())) 
        where UUID is null 
              and ID = NEW.ID   
    end

否则不是每行更新所有空记录,如果处理的记录超过1,则可能导致系统看到它需要多次锁定单个记录,系统无法确定哪个新记录。 ID的更新应该有效。通过限制特定记录,我相信您可以消除您的错误。