使用自动递增的 ID 作为值的一部分将条目插入到其表中

Posted

技术标签:

【中文标题】使用自动递增的 ID 作为值的一部分将条目插入到其表中【英文标题】:Inserting an entry to its table using the auto incremented ID as part of the value 【发布时间】:2015-10-05 13:09:27 【问题描述】:

是否可以只使用一个查询将条目插入到表中,其中一列需要使用条目的 ID

示例表架构:

tbl_post:
 col_id: (auto-increment)
 title: string
 body: string
 guid: string

示例查询:

INSERT INTO tbl_post(title, body, guid)
VALUES("sample title", "sample body", CONCAT("http://site/?id=", col_id))

查询结果:

col_id | title        | body        | guid
-------+--------------+-------------+--------------
1      | sample title | sample body | http://site/?id=1

【问题讨论】:

How to get the next auto-increment id in mysql的可能重复 问题不清楚。 我想要一个将导致我的“查询结果”的查询 你可以创建一个存储过程,最好的。一呼百应。否则,根据您的编程接口,您可以进行后续调用以获取刚刚插入的 id。 (您当然不需要其他数据,因为您刚刚提供了它) 【参考方案1】:

很遗憾,这是不可能的;您不能使用自动递增值来填充单个 INSERT 中的其他列。

一般来说,最好的选择是运行单个事务,执行INSERT,后跟UPDATE

START TRANSACTION;

INSERT INTO tbl_post(title, body)
VALUES("sample title", "sample body");

UPDATE tbl_post SET guid=CONCAT("http://site/?id=", col_id) 
 WHERE col_id=LAST_INSERT_ID();

COMMIT;

这保证在 InnoDB 表上是原子的,因此它要么成功要么完全失败。您对 MyISAM 不走运,因为它不支持事务。

正如@Drew 在 cmets 中指出的那样,您可以将其转换为 stored procedure:

CREATE PROCEDURE insupd (ttitle VARCHAR(32), tbody VARCHAR(16))
BEGIN
 START TRANSACTION;
 INSERT INTO tbl_post(title, body)
  VALUES(ttitle, tbody);

 UPDATE tbl_post SET guid=CONCAT("http://site/?id=", col_id) 
  WHERE col_id=LAST_INSERT_ID();
 COMMIT;
END;

完成后,您只需使用以下内容插入数据:

CALL insupd('yourfancytitle','blah.');

【讨论】:

【参考方案2】:

你可以用 Max Id + 1 做到这一点。

也许这个话题会对你有所帮助。

php mysql insert (max(id)+1)

【讨论】:

以上是关于使用自动递增的 ID 作为值的一部分将条目插入到其表中的主要内容,如果未能解决你的问题,请参考以下文章

使用 Entity Framework 5 将特定 id 插入 MySQL 中的自动递增字段

使用 Entity Framework 5 将特定 id 插入 MySQL 中的自动递增字段

自增长字段值的连续递增实现

使用 PDO 插入时获取自动递增行 ID [重复]

Java/Spring Boot Web 应用程序。插入具有自动递增 id 列的新行

在存储的 CLOB 中包含自动递增值