让我先声明一下我在 DBA 方面的经验仅限于介绍性的本科大学课程,并且我才刚刚开始使用 PostgreSQL。
我想定期以编程方式将数据从一个非常大(~4GB)的平面 CSV(我知道,不是最好的格式,但这是我必须使用的)导入 PostgreSQL 数据库。我相信我可以用它COPY FROM
来完成这个任务。遇到与现有记录匹配或冲突的 CSV 行时会发生什么?它会更新记录、忽略它还是抛出错误?这种行为可以改变吗?
该文档部分指出:
COPY FROM 将调用任何触发器并检查目标表上的约束。但是,它不会调用规则。
我对该语句的解释是,该语句不会更新现有记录,而是将 CSV 条目视为新记录,这反过来会违反可能放置在列上的约束。这个对吗?如果是这样,我唯一的做法似乎是DELETE
在每次导入数据之前在表上发布。这让我觉得效率非常低。
更新
可以在此处找到我正在使用的数据集示例。我想从这个高度去规范化的源中导入和规范化数据。如您所见,每个许可证记录可能会针对可能存在的每个相关天线重复。
COPY FROM
不会违反数据库的完整性。当约束失败时,会抛出错误,并且不会复制任何数据(它会回滚)。
这种行为是不可改变的。您可以使用编程语言编写脚本来帮助您进行复制。