我们正在将数据库从 Advantage Database 迁移到 PostgreSQL。我们使用的常见模式之一是这样的:
TRY DROP TABLE #TemporaryTable; CATCH ALL END TRY;
SELECT Field1, Field2
INTO #TemporaryTable
FROM MainTable
WHERE Type=1;
CREATE INDEX FirstIndex ON #TemporaryTable (Field2);
我们设置 TAdsQuery 并发出 ExecSQL。然后我们设置一个 TAdsTable 并打开#TemporaryTable。然后我们可以将 IndexName 设置为“FirstIndex”。如果您愿意,您可以在设计时执行此操作,并且所有索引都显示在 IndexName 下拉列表中。
在 PostgreSQL 下研究此模式时,我们发现索引在 TFDTable 下不可用。这是我们迄今为止实现的模式。
使用 TFDQuery 执行:
DROP TABLE IF EXISTS TemporaryTable;
SELECT Field1, Field2
INTO TEMP TemporaryTable
FROM MainTable
WHERE Type=1;
CREATE INDEX FirstIndex ON TemporaryTable (Field2);
如果我们发出以下 SQL,我们可以看到索引确实存在:
SELECT
indexname,
indexdef
FROM
pg_indexes
但是 TFDTable 无法在设计时或运行时设置它们。
我们当然可以使用 IndexFieldNames,但 UI 的其他部分会根据专门创建的预定义索引列表自行实现。
经过挖掘,我发现 PostgreSQL 将临时表放在集合的唯一架构名称下。
我能够编写一个辅助函数,给定 TFDConnection 对象,该函数将返回连接的当前唯一架构:
select nspname from pg_namespace where oid = pg_my_temp_schema();
只要我将此函数的结果分配给 TFDTable 的 SchemaName 属性,它就可以挂接其他所有内容。