我在
MariaDB
标准化表中命名为
L1MasterTable
带柱子
L2AddressTable
带柱子
L3AddressDetailTable
带柱子
表格之间有关系
L1MasterTable:L2AddressTable - 1:n
L2MasterTable:L2AddressTable - 1:n
在
Delphi
中,我有3个非常简单的FDQueries来管理上面的表
FDQuery1.Connection:=DataModule1.c;
FDQuery1.SQL.Clear;
FDQuery1.SQL.Text:='SELECT id, name, surname, email from L1MasterTable';
DataSource1.DataSet:=FDQuery1;
FDQuery1.FetchOptions.Mode := fmAll;
FDQuery1.CachedUpdates:=true; //I am working in CachedUpdatesMode for all tables
DataModule1.FDQueryOpen(FDQuery1,'FDQuery1 initDB');
FDQuery2.Connection:=DataModule1.c; //detail ISU a grid vpravo
FDQuery2.CachedUpdates:=true;
FDQuery2.SQL.Clear;
FDQuery2.SQL.Text:='SELECT id, pid, City, Street, Country from L2AddressTable order by pid';
FDQuery2.FetchOptions.Mode := fmAll;
FDQuery2.FetchOptions.DetailCascade:=true; //needed to be treated as Master/Detail mode
DataSource2.DataSet:=FDQuery2;
DataModule1.FDQueryOpen(FDQuery2,'FDQuery2 initDB');
FDQuery3.SQL.Clear;
FDQuery3.Connection:=DataModule1.c;
FDQuery3.CachedUpdates:=true;
FDQuery3.SQL.Text:='SELECT id, pid, addressdetail from L3AddressDetailTable order by pid';
DataSource3.DataSet:=FDQuery3;
FDQuery3.FetchOptions.DetailCascade:=true;
DataModule1.FDQueryOpen(FDQuery3,'FDQuery3 initDB');
我的问题是: 例如,当我在
L1MasterTable
中创建一条记录以及在 L2MasterTable
和 L3MasterTable
中创建详细记录时,我该如何处理案例。在 CachedUpdateMode 有新记录 id <0. For example -1, -2, ...
When I want to add new record in L2MasterTable
我不知道如何处理父表中不存在的 id
。
在 Delphi 中使用 Firedac 处理这种情况的最佳实践是什么?
我必须提到我的 MariaDB 在 MyISAM 中工作,我无法直接在数据库中设置关系。
所有请求的功能均由名为
FireDAC
的 TFDSchemaAdapter
组件提供。
该组件处理所有 id 分配。
Delphi 文档: https://docwiki.embarcadero.com/Libraries/Sydney/en/FireDAC.Comp.Client.TFDSchemaAdapter
示例: https://docwiki.embarcadero.com/CodeExamples/Athens/en/FireDAC.SchemaAdapterMemTable_Sample
非常简单的片段,显示数据保存执行数据库,一旦根据上面的手册设置了所有内容:
if FDSchemaAdapter1.UpdatesPending then
begin
FDSchemaAdapter1.ApplyUpdates; //applies correct IDs to all binded queries
FDQuery1.CommitUpdates;
FDQuery2.CommitUpdates;
FDQuery3.CommitUpdates;
end;