在 SQLite 数据库上更新一对多关系 table 的有效方法
Efficient way to update one-to-many relationship table on an SQLite database
我有一个包含两个 table 的 SQLite 数据库,一对多关系如下:
People
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` VARCHAR(200) NOT NULL,
`unique_identifier` VARCHAR(200)
Address
`id` VARCHAR(20) PRIMARY KEY AUTOINCREMENT,
`people_id` INTEGER,
`includes_unique_indentifier` VARCHAR(256),
`name` VARCHAR(200) NOT NULL,
FOREIGN KEY(people_id) REFERENCES People(id)
Address
table 中有一些记录的 people_id
为 null
。对于这些地址,他们属于哪个人,可以通过正则表达式匹配 People.unique_identifier
到 Address.includes_unique_identifier
.
来识别
忽略数据冗余,我想更新每个 Address.name
以匹配其对应的 People.name
记录。
目前我的查询如下所示:
UPDATE address
SET name = (
SELECT notes
FROM people
WHERE address.people_id = id OR address.includes_unique_indentifier LIKE ("%" || unique_identifier || "%")
)
根据我的理解,这是一个低效的查询,因为它将查看地址 table 并递归 运行 table 中每条记录的子查询。我正在寻找一种有效执行此更新的方法。我使用的 SQLite 版本不支持 UPDATE
查询中的 FROM
子句。
目前 Address
table 上没有索引。
如果您计划升级到支持 UPDATE ... FROM ...
语法的版本 (3.30.0+),您可以使用此模拟表连接的查询:
UPDATE address AS a
SET name = p.name
FROM people AS p
WHERE p.id = a.people_id OR a.includes_unique_indentifier LIKE '%' || p.unique_identifier || '%';
我有一个包含两个 table 的 SQLite 数据库,一对多关系如下:
People
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` VARCHAR(200) NOT NULL,
`unique_identifier` VARCHAR(200)
Address
`id` VARCHAR(20) PRIMARY KEY AUTOINCREMENT,
`people_id` INTEGER,
`includes_unique_indentifier` VARCHAR(256),
`name` VARCHAR(200) NOT NULL,
FOREIGN KEY(people_id) REFERENCES People(id)
Address
table 中有一些记录的 people_id
为 null
。对于这些地址,他们属于哪个人,可以通过正则表达式匹配 People.unique_identifier
到 Address.includes_unique_identifier
.
忽略数据冗余,我想更新每个 Address.name
以匹配其对应的 People.name
记录。
目前我的查询如下所示:
UPDATE address
SET name = (
SELECT notes
FROM people
WHERE address.people_id = id OR address.includes_unique_indentifier LIKE ("%" || unique_identifier || "%")
)
根据我的理解,这是一个低效的查询,因为它将查看地址 table 并递归 运行 table 中每条记录的子查询。我正在寻找一种有效执行此更新的方法。我使用的 SQLite 版本不支持 UPDATE
查询中的 FROM
子句。
目前 Address
table 上没有索引。
如果您计划升级到支持 UPDATE ... FROM ...
语法的版本 (3.30.0+),您可以使用此模拟表连接的查询:
UPDATE address AS a
SET name = p.name
FROM people AS p
WHERE p.id = a.people_id OR a.includes_unique_indentifier LIKE '%' || p.unique_identifier || '%';