将批量数据插入到具有一对多关系的表中
Insert bulk data into tables that are in a one to many relationship
我有一个使用 Npgsql 连接到 Postgres 数据库的 .NET 应用程序,我正在尝试将数据导入两个 tables,比如 Users 和 Todos。一个用户有很多待办事项。 User table 有一个由数据库自动设置的 id
列,Todos table 有一个指向 Users table 的外键,称为 user_id
。
现在,我知道如何插入用户,我知道如何插入待办事项,但我不知道如何为这些待办事项设置 user_id
,因为用户的 id
列是仅在将用户插入数据库后才知道。有什么想法吗?
这取决于您导入的方式和使用的工具。如果您使用的是原始 INSERT 语句,PostgreSQL 有一个 RETURNING 子句,它将向您发送回插入语句的 ID (see the docs)。
如果您使用二进制 COPY(这是批量导入数据的最有效方式),则没有此类选项。在这种情况下,一种好方法是一次性 "allocate" 所有 ID,方法是递增支持 ID 列的序列,然后在导入时发送 ID。这意味着数据库生成这些 ID 的时间更长了——您像任何其他字段一样显式发送它们。
实际上,假设您有 100 个用户(以及任意数量的待办事项)。您可以调用 setval
将序列递增 100,然后您可以导入您的用户,将他们的 ID 显式设置为这 100 个值。这还允许您在待办事项上指定用户 ID。但是,如果您这样做,请注意如果其他人同时修改序列,则会出现并发问题。
我有一个使用 Npgsql 连接到 Postgres 数据库的 .NET 应用程序,我正在尝试将数据导入两个 tables,比如 Users 和 Todos。一个用户有很多待办事项。 User table 有一个由数据库自动设置的 id
列,Todos table 有一个指向 Users table 的外键,称为 user_id
。
现在,我知道如何插入用户,我知道如何插入待办事项,但我不知道如何为这些待办事项设置 user_id
,因为用户的 id
列是仅在将用户插入数据库后才知道。有什么想法吗?
这取决于您导入的方式和使用的工具。如果您使用的是原始 INSERT 语句,PostgreSQL 有一个 RETURNING 子句,它将向您发送回插入语句的 ID (see the docs)。
如果您使用二进制 COPY(这是批量导入数据的最有效方式),则没有此类选项。在这种情况下,一种好方法是一次性 "allocate" 所有 ID,方法是递增支持 ID 列的序列,然后在导入时发送 ID。这意味着数据库生成这些 ID 的时间更长了——您像任何其他字段一样显式发送它们。
实际上,假设您有 100 个用户(以及任意数量的待办事项)。您可以调用 setval
将序列递增 100,然后您可以导入您的用户,将他们的 ID 显式设置为这 100 个值。这还允许您在待办事项上指定用户 ID。但是,如果您这样做,请注意如果其他人同时修改序列,则会出现并发问题。