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

时间:2015-10-05 13:09:27

标签: mysql insert-into

是否可以只使用一个查询向表中插入一个条目,其中一个列需要使用条目的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

2 个答案:

答案 0 :(得分: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在评论中指出的那样,您可以将其转换为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.');

答案 1 :(得分:0)

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

也许这个主题会帮助你。

php mysql insert (max(id)+1)