info_schema自动递增

时间:2012-02-28 09:11:23

标签: mysql

我有一张桌子member。我想使用自动增量来创建用户ID。 我尝试过使用以下内容:

SET new.user_id = CONCAT(new.name, LPAD((SELECT AUTO_INCREMENT FROM 
information_schema.TABLES WHERE
TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'member'),3,'0'));

但是当我插入一个新成员时,我收到一条错误消息user_id cannot be null并且没有添加数据。我希望用户ID将显示为jos001作为主键。

请帮助我..如何实现?

2 个答案:

答案 0 :(得分:0)

您正在执行您提供的查询中显示的UPDATE / TRIGGER。

INSERT后更新将起作用。如果TRIGGER位于同一个数据库中(因为它可能会以无限循环结束),它将无法工作。

您应该做的是,在尝试插入之前,使用您使用的任何编程语言。进行插入时,请准备插入名称。

答案 1 :(得分:0)

尝试这个BEFORE INSERT触发器 -

完整脚本:

CREATE TABLE member(
  user_id VARCHAR(23) NOT NULL,
  name VARCHAR(20) DEFAULT NULL
);

DELIMITER $$

CREATE TRIGGER trigger1
  BEFORE INSERT
  ON member
  FOR EACH ROW
BEGIN

  -- Find next id for new user - MAX+1
  SELECT MAX(CAST(SUBSTRING(user_id, LENGTH(user_id) - 2, 3) AS SIGNED)) + 1 INTO @next_id
    FROM member WHERE SUBSTRING(user_id, 1, LENGTH(user_id) - 3) = NEW.name;

  SET NEW.user_id = CONCAT(NEW.name, LPAD(IFNULL(@next_id, 1), 3,'0'));
END$$

DELIMITER ;

插入一些记录:

INSERT INTO member VALUES('', 'jos');
INSERT INTO member VALUES('', 'jos');
INSERT INTO member VALUES('', 'jos');
INSERT INTO member VALUES('', 'alex');
INSERT INTO member VALUES('', 'alex');
INSERT INTO member VALUES('', 'jos');

检查结果:

SELECT * FROM member;

+---------+------+
| user_id | name |
+---------+------+
| jos001  | jos  |
| jos002  | jos  |
| jos003  | jos  |
| alex001 | alex |
| alex002 | alex |
| jos004  | jos  |
+---------+------+