mysql - 如何在单个事务中保留具有主从关系的表?

标签 mysql delphi delphi-xe3 zeos

我正在尝试使用 Delphi XE3 和 Zeos 7.0.4 在 MySQL 5.6 中保留两个具有主从关系的表。当我在主服务器上执行ApplyUpdates 时,自动增量字段的值保持为0。我需要自动增量值,因此我可以将详细表与来自ApplyUpdates 的主表的ID 字段链接起来。我使用 ZConnection 和 AutoCommit = FALSE 和 TransactionIsolationLevel = tiReadCommissed,ZQuery 和 CachedUpdates = TRUE。我错过了什么?

ZQPerson.Append;
ZQEmployee.Append;
try
  ZQPersonName.Value := Edit1.Text;
  ZQPerson.ApplyUpdates; //Here I expected to have the auto increment value on the Id field of ZQPerson, but it returns always 0
  ZQEmployeePersonID.Value := ZQPersonId.Value; //Here I'd link Employee to it's Person record
  ZQEmployeeRegNo.Value := StrToInt(Edit2.Text);
  ZQEmployee.ApplyUpdates;
  ZConnection1.Commit; //Here I would persist both tables in a single transaction to avoid master table without details
except
  ZQPerson.CancelUpdates;
  ZQEmployee.CancelUpdates;
  ZConnection1.Rollback; //In case of exceptions rollback everything
  raise;
end;
ZQPerson.CommitUpdates;
ZQEmployee.CommitUpdates;

我的 ZSQLMonitor 跟踪是这样的:

2013-08-29 00:01:23 cat: Execute, proto: mysql-5, msg: INSERT INTO person (Id, name) VALUES (NULL, 'Edit1') --> This is just after ZQPerson.ApplyUpdates
2013-08-29 00:01:50 cat: Execute, proto: mysql-5, msg: INSERT INTO employee (Id, RegNo, ProductId) VALUES (NULL, 1000, 0), errcode: 1452, error: Cannot add or update a child row: a foreign key constraint fails (`test`.`employee`, CONSTRAINT `FK_A6085E0491BDF8EE` FOREIGN KEY (`PersonId`) REFERENCES `person` (`Id`) --> This is just after ZQEmployee.ApplyUpdates
2013-08-29 00:02:05 cat: Execute, proto: mysql-5, msg: Native Rollback call --> Rollback after Exception on the ZQEmployee.ApplyUpdates

最佳答案

您是否使用 ZConnection1.StartTransaction 启动事务?我也认为您必须在调用 ZQuery1.ApplyUpdates 后刷新 ZQuery1 才能获取新的 id-

阅读您的评论,您一定是在执行不带 where 子句的 select * 吗?正确的?我建议您使用这种方法:

1) 选择并增加当前的自动增量值
2) 从主表中选择 where id=[step1 id]//当然它会是空的
3) 使用步骤 1 中的 id 添加详细信息
4)在主数据集中分配id
5)应用两个更新

关于mysql - 如何在单个事务中保留具有主从关系的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18495309/

相关文章:

delphi - delphi中的数字很大

未检测到 Windows 7 默认打印机

multithreading - 多线程访问数据

mysql - 具有多个Where子句的SQL

mysql - 如何在实时数据库上运行大更新?

regex - 如何从输入中获取句子编号?

delphi - 如何计算函数的运行时间?

windows - 如何从任务栏(XE4)隐藏 firemonkey 应用程序按钮?

MySQL选择从不同ip访问站点的用户

python - 安装 mysql-python 时遇到问题