Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在另一个字段中重用自动插入的生成字段_Mysql_Sql_Database - Fatal编程技术网

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

Mysql 在另一个字段中重用自动插入的生成字段,mysql,sql,database,Mysql,Sql,Database,我正在开发一个应用程序,该应用程序将为用户填写的表单生成对开本, 在内部,我将处理一个documentId,它将自动递增,但是我必须生成客户端的 不同格式的对开本 示例: Folio 100613A100 10 - day 06 - month 13 - year A - if regular E - if special 100 - AI number 基本上我可以从我的PHP代码中找到前7位数字,但是因为我不知道AI数字是多少,所以我可以创建 该值直到插入完成为止 我目前的方法是在不填

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

Folio 100613A100
10 - day
06 - month
13 - year
A - if regular 
E - if special 
100 - AI number
基本上我可以从我的PHP代码中找到前7位数字,但是因为我不知道AI数字是多少,所以我可以创建 该值直到插入完成为止

我目前的方法是在不填充该字段的情况下进行插入,并在插入后立即使用
LAST\u insert\u ID()
生成对开本并更新表,但这对我来说是一种开销,所以我想知道是否有隐藏的宝石 在MySql中,这将允许在insert上使用AI值


请注意,我不能在插入之前使用
LAST\u INSERT\u ID(),我的实现工作得很好,我没有任何问题。我只是想知道,为了获得一点知识,是否有可能。

您可以在插入触发器后使用。请参阅本手册:

您可以在插入前使用
触发器和用于排序的单独表格(如果您不介意的话)在插入时生成对开本编号

首先是排序表

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', ...);
你的桌子上有

| ID | FOLIO |... -----------------... | 1 | 160613A1 |... | 2 | 160613E2 |... 然后使用此存储过程插入新记录

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',...);

这里是这方面的演示。

解释为什么您认为这是一种开销?我在为1条记录生成数据的同时,对数据库执行了两次命中操作。第二次命中以获取最后一个插入id对于数据库来说基本上是零功。虽然它在最纯粹的意义上是开销,但它可能是您可以进行的最便宜的DB操作之一,因此我不担心它。为什么不在检索数据时附加id呢?在同一行中有两个相同的id似乎是多余的,只是为了澄清我是否正确理解一个表中的两列:
documentid
,这是应该生成的
自动增量
对开本
?您能说明如何生成吗?在MySql中,插入触发器后不能更改
中的
NEW
值。你说“插入触发器后不能更改新值”是什么意思?我的意思和我说的一模一样:在插入后的
触发器中,您可以访问自动递增列的值,但不能更改任何列值。@isJustMe非常欢迎:)有关简单的SP方法,请参阅更新的答案。