【发布时间】:2022-12-18 14:24:39
【问题描述】:
我是 PostgresQL 的新手,我遇到了标题中的错误。
我有一个带有空列的 table_a,我想在匹配时用 table_b 中的列中的数据填充。
表_a:
id | name | town | town_id |
1 | name1 | city1 | - |
2 | name2 | city1 | - |
3 | name3 | city2 | - |
4 | name4 | city2 | - |
5 | name5 | city3 | - |
表_b
id | town_name
1 | city1
2 | city2
3 | city3
我想 INSERT the table_b.id INTO table_a.town_id ON town = town_name
INSERT INTO
table_a(town_id)
SELECT
table_b.id
FROM
table_b
JOIN
table_a
ON town = town_name;
问题是我在标题中得到错误,在一行实际上并不存在(例如:table_a 有 20 行,但错误在第 21 行......)。那里发生了什么?它似乎正确地插入了数据,但它并没有在表的末尾停止,因此触发了非空约束。
【问题讨论】:
-
如果要更改现有行,则需要使用 UPDATE。
-
您是否检查过这不是以 0 开头的索引的问题?
-
- 行是空的,我只是将列添加到表中
-
- 我删除了索引,仍然是同样的错误。此外,如果我再次运行该命令,失败的行会增加一个,所以它是 22,然后是 23、24……等等
-
INSERT 创建新行,它不触及现有行。 (除非您的声明中有 ON CONFLICT 检查)。在您的情况下,您似乎需要 UPDATE 语句而不是 INSERT 语句。关于索引的评论对我来说真的很奇怪,世界上没有任何索引可以改变已经犯下的错误。
标签: postgresql sql-insert