You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TMyQuery执行插入后,如何获取新记录的主键?

解决MyDAC执行INSERT后获取自增主键的问题

针对你用TMyQuery执行INSERT后无法获取主键的情况,结合MySQL 8和MyDAC的特性,给你三种实用方案:

方案1:使用MyDAC内置的GetLastInsertID方法

这是最直接的方式,MyDAC作为MySQL专用组件,封装了MySQL的131655函数,无需额外写SQL:

// 构造INSERT语句
MyQuery1.SQL.Text := 'INSERT INTO your_table(col1, col2) VALUES(:val1, :val2)';
// 绑定参数
MyQuery1.ParamByName('val1').AsString := '测试值';
MyQuery1.ParamByName('val2').AsInteger := 456;
// 执行插入
MyQuery1.Execute;
// 获取自增主键
var NewPrimaryKey := MyQuery1.GetLastInsertID;

方案2:通过SELECT 131655获取结果集

在INSERT语句后拼接查询语句,用Open替代Execute(因为要返回结果集),再通过FieldByName读取:

MyQuery1.SQL.Text := 'INSERT INTO your_table(col1, col2) VALUES(:val1, :val2); SELECT 131655 AS NewID';
MyQuery1.ParamByName('val1').AsString := '测试值';
MyQuery1.ParamByName('val2').AsInteger := 456;
// 用Open执行,会返回查询结果
MyQuery1.Open;
// 读取主键
var NewPrimaryKey := MyQuery1.FieldByName('NewID').AsInteger;

方案3:利用MySQL 8.0.22+的RETURNING语法

如果你的MySQL版本是8.0.22及以上,可以直接用RETURNING子句返回主键,执行后直接读取字段:

MyQuery1.SQL.Text := 'INSERT INTO your_table(col1, col2) VALUES(:val1, :val2) RETURNING id';
MyQuery1.ParamByName('val1').AsString := '测试值';
MyQuery1.ParamByName('val2').AsInteger := 456;
// 执行后直接读取返回的主键字段
MyQuery1.Execute;
var NewPrimaryKey := MyQuery1.FieldByName('id').AsInteger;

关于你遇到的问题说明

  • 你之前调用Execute()后用FieldByName()找不到字段,是因为Execute()用于执行无结果集的SQL(比如INSERT/UPDATE/DELETE),不会返回数据;如果要获取返回值,需要用Open()或者组件提供的专用方法。
  • SQLInsert是MyDAC自动生成INSERT语句时用到的字符串列表,手动编写INSERT语句时不需要操作它。

内容的提问来源于stack exchange,提问作者John John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:27:38