无法通过Postgres获得null null约束

时间:2016-02-05 00:11:23

标签: postgresql null

我正在尝试将数据从一个表移动到另一个表:

zuri=# INSERT INTO lili_code (uuid, arrow, popularname, slug, effdate, codetext)           
SELECT uuid, arrow, popularname, slug, effdate, codetext
FROM newarts;
ERROR:  null value in column "shorttitle" violates not-null constraint

我的问题: shorttitle不是我试图填写的列之一,那么为什么它是无效的呢?

请注意:

  1. shorttitle为空=真。我明白这是!= null,但我认为它可能是相关的。
  2. 除了shorttitle之外,lili_code中还有很多其他列不属于newarts。
  3. 在这一点上,我认为我唯一的选择是

    一个。手工插入(哎呀!)

    湾制作csv并导入

    ℃。将所有缺少的列从lili_code添加到newarts并确保它们不是NULL并且至少具有默认值。

    我错过了一个选项吗?什么是最好的解决方案?我正在使用django 1.9.1,python 2.7.11,Ubuntu 15.10和Postgresql 9.4。

    一如既往地谢谢。

3 个答案:

答案 0 :(得分:1)

由于该列为非null,因此您需要提供一个值。

如果没有真实数据,您可以在SELECT语句的INSERT部分动态计算,它不必是源表中的实际列。

如果您对空字符串没问题,可以

INSERT INTO lili_code 
(uuid, arrow, popularname, slug, effdate, codetext, shorttitle)           
SELECT uuid, arrow, popularname, slug, effdate, codetext, ''
FROM newarts;

或许你也想在这个专栏中使用popularname

INSERT INTO lili_code 
(uuid, arrow, popularname, slug, effdate, codetext, shorttitle)           
SELECT uuid, arrow, popularname, slug, effdate, codetext, popularname
FROM newarts;

答案 1 :(得分:1)

如果您没有在INSERT上定义值,则数据库将插入NULL或默认值。

如果列不允许NULL,您将收到错误消息。因此要么提供虚拟值,要么更改字段以允许NULL

答案 2 :(得分:1)

您可以为列定义默认值,例如:

alter table lili_code alter shorttitle set default '';