使用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
相关产品推荐
相关产品推荐

