在另一个字段中重用自动插入生成的字段

时间:2013-06-16 01:57:00

标签: mysql sql database

我正在开发一个应用程序,它将为用户创建的某些表单填充生成作品集, 在内部我将处理一个将自动递增的documentId,但是我必须生成客户端 不同格式的作品集 示例:

Folio 100613A100
10 - day
06 - month
13 - year
A - if regular 
E - if special 
100 - AI number

基本上我可以从我的PHP代码中输入前7位数,但是因为我不知道我能创建的AI编号是什么 这个值直到插入完成,

我目前的做法是在不填充该字段的情况下进行插入,并在插入后使用LAST_INSERT_ID() 生成Folio并更新表格,但这对我来说是一种开销,所以我想知道是否有任何隐藏的宝石 在MySql中允许在插入上使用AI值。

请注意,我无法在插入之前使用LAST_INSERT_ID() id ,因为该应用将具有并发访问权限,我的实现工作正常,我没有任何问题我只是想知道是否可以获得一点知识。

2 个答案:

答案 0 :(得分:2)

您可以使用BEFORE INSERT触发器和单独的表格(如果您不介意)在插入时生成对开页码,以便进行排序。

首先是排序表

CREATE TABLE table1_seq 
  (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);

您的实际表格

CREATE TABLE Table1
  (`id` INT NOT NULL DEFAULT 0, 
   `folio` VARCHAR(32)
   ...
  );

触发器

DELIMITER $$
CREATE TRIGGER tg_table1_insert 
BEFORE INSERT ON Table1
FOR EACH ROW
BEGIN
  INSERT INTO table1_seq VALUES (NULL);
  SET NEW.id = LAST_INSERT_ID();
  SET NEW.folio = CONCAT(DATE_FORMAT(CURDATE(), '%d%m%y'), UPPER(NEW.folio), NEW.id);
END$$
DELIMITER ;

现在您可以插入新记录

INSERT INTO Table1 (`folio`, ...)
VALUES ('a', ...), ('e', ...);

你的表1中有你的

| ID |    FOLIO |...
-----------------...
|  1 | 160613A1 |...
|  2 | 160613E2 |...

这是 SQLFiddle 演示。

另一种方式只是将INSERTUPDATE包装在存储过程中

DELIMITER $$
CREATE PROCEDURE sp_table1_insert (IN folio_type VARCHAR(1), ...)
BEGIN
  DECLARE newid INT DEFAULT 0;
  START TRANSACTION;
  INSERT INTO table1 (id, ...) VALUES (NULL, ...);
  SET newid = LAST_INSERT_ID();
  UPDATE table1 
     SET folio = CONCAT(DATE_FORMAT(CURDATE(), '%d%m%y'), UPPER(folio_type), newid)
   WHERE id = newid;
  COMMIT;
END$$
DELIMITER ;

然后使用此存储过程插入新记录

CALL sp_table1_insert ('a',...);
CALL sp_table1_insert ('e',...);

以下是 SQLFiddle 演示。

答案 1 :(得分:1)

您可以使用插入后触发器。请参阅本手册:http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html