mysql触发器更新新添加的行的一个字段

时间:2014-12-12 13:22:00

标签: mysql triggers

我有'用户'表格包含以下字段: - user_id(int,auto increment PK) encrypted_userid(varchar 50) user_name(varchar 50) user_location(varchar 50)

我想要做的是创建一个触发器,以便在将users表插入user_name和user_location时,我希望使用来自user_id的AES_ENCRYPTED值填充encrypted_userid字段 - 例如AES_ENCRYPT(user_id,' MYAESKEY')但仅适用于新插入的行

这是否可以在MySQL中使用某种触发器?

提前致谢。

2 个答案:

答案 0 :(得分:0)

我使用MySQL - Trigger for updating same table after insert(JCLG' s条目)解决了我的问题

CREATE TRIGGER `useridinserttrigger` BEFORE INSERT ON `users` 
FOR EACH ROW BEGIN
    DECLARE tmpid,tmpid2 INT(11);
    SELECT user_id INTO tmpid FROM users ORDER BY user_id DESC LIMIT 1;     
    SET tmpid2=tmpid+1;
    SET new.encrypted_userid=AES_ENCRYPT(tmpid2,'MYAESKEY'); 

END;

答案 1 :(得分:0)

  

那么我的问题有一个解决方案,不会失败等吗?使用触发器 - 我尝试阅读其他来源的所有其他解决方案都没有用。

所有解决方案都围绕LAST_INSERT_ID(),因为它是唯一多用户安全获取自动生成ID的方式。


首先可能的方式,如果你非常喜欢触发器,那就是为自动生成的序列设置一个单独的表。您的架构将如下所示

CREATE TABLE users_seq (user_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT);
CREATE TABLE users
(
  user_id INT NOT NULL PRIMARY KEY DEFAULT 1, 
  encrypted_userid varchar(50), 
  user_name varchar(50), 
  user_location varchar(50),
  FOREIGN KEY user_id_fk (user_id) REFERENCES users_seq (user_id)
);

触发器

DELIMITER //
CREATE TRIGGER useridinserttrigger
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
  INSERT INTO users_seq() VALUES();
  SET NEW.user_id = LAST_INSERT_ID(),
      NEW.encrypted_userid = AES_ENCRYPT(LAST_INSERT_ID(), 'MYAESKEY');
END//
DELIMITER ;

第二种方式是利用现有架构但使用存储过程

DELIMITER //
CREATE PROCEDURE insert_user(IN _name VARCHAR(50), IN _location VARCHAR(50))
BEGIN
  DECLARE _id INT;

  START TRANSACTION;
  INSERT INTO users (user_name, user_location) VALUES(_name, _location);
  SET _id = LAST_INSERT_ID();
  UPDATE users 
     SET encrypted_userid = AES_ENCRYPT(_id, 'MYAESKEY')
   WHERE user_id = _id;
  COMMIT;
END//
DELIMITER ;

样本用法:

CALL insert_user('johndoe', null);