使用自动递增的 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 中的自动递增字段