1

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

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

基本上我可以从我的 PHP 代码中获取前 7 位数字,但是因为我不知道 AI 数字是多少,所以我可以在插入完成之前创建这个值,

我目前的方法是在不填充该字段的情况下进行插入,并在插入后LAST_INSERT_ID() 立即用于生成对开和更新表,但这对我来说似乎有点开销,所以我想知道 MySql 中是否有任何隐藏的宝石会允许在刀片上使用 AI 值。

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

4

2 回答 2

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

| 身份证 | 对开 |...
-----------------...
| 1 | 160613A1 |...
| 2 | 160613E2 |...

这是SQLFiddle演示。

另一种方法是将您的INSERTand包装UPDATE在存储过程中

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演示。

于 2013-06-16T02:52:31.613 回答
1

您可以使用AFTER INSERT TRIGGER。请参阅本手册:http ://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

于 2013-06-16T02:05:14.020 回答