【问题标题】:ERROR: null value in column " " of relation " " violates not-null constraint DETAIL: Failing row contains (21, null, null, null, ...)错误:关系 \" \" 的列 \" \" 中的空值违反了非空约束 详细信息:失败的行包含 (21, null, null, null, ...)
【发布时间】: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


【解决方案1】:

固定的:

正如@Frank Heikens 所建议的,我不得不使用 UPDATE

UPDATE table_a
SET town_id = table_b.id
FROM table_b
WHERE town = town_name;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2021-08-18
    • 2012-11-02
    相关资源
    最近更新 更多