填充行的其余部分/避免违反空约束

Posted

技术标签:

【中文标题】填充行的其余部分/避免违反空约束【英文标题】:Populating the Rest of a Row/Avoiding Violation of Null Constraint 【发布时间】:2018-03-22 14:15:34 【问题描述】:

我有一张桌子(称为 new_table)。它由 4 个字段组成。 id(带有 PK 和 NOT NULL)和 field1、field2 和 field3(没有 NOT NULL)。 表中填充的唯一数据是 id 字段中的 1 和 2。 (我将在下面附上一个屏幕截图)现在我想使用下面的查询用一些值填充这两行的其余部分。

INSERT INTO new_table (field1, field2, field3)
VALUES
 ('value1', 'value2', 'value3'),
 ('value4', 'value5', 'value6');

这是我经常得到的:

“错误:“id”列中的空值违反了非空约束 详细信息:失败行包含 (null, value1, value2, value3)。”

是否认为我正在尝试填充第三和第四行?如何使用这些值填充第 1 行和第 2 行的其余部分?

table currently looks like this

【问题讨论】:

您可能假设id 是串行类型(具有生成器提供的DEFAULT 值的整数列) joop 它只是带有 PK 且不为空的常规整数。无序列号 ,而不是字段。 好吧,那么你必须在插入记录时为其提供一个值。 joop 我不想再插入任何记录。我正在尝试使用 id=1 和 id=2 完成记录。所以我需要使用更新。对?我会在上面附上它的屏幕截图。 【参考方案1】:

您正在插入您怀疑的新行(理论上让我们将它们视为第 3/4 行),而不是更新第 1 行和第 2 行。要更新现有行,请使用更新语句。

UPDATE new_table 
SET
    field1= 'value1'
    , field2='value2'
    , field3='value3' 
WHERE id = 1;

UPDATE new_table 
SET
    field1= 'value4'
    , field2='value5'
    , field3='value6' 
WHERE id = 2;

【讨论】:

ID 的数据类型,我假设为数字(因为没有指定其他内容,这很正常),但您可能有一个 varchar 的 ID,在这种情况下它需要一个 Id = '1' - 如果是字符,但您打算存储数字 ID,请将数据类型更改为合适的数字。 id数据类型为整数 根据您使用的工具的设置,您可能需要提交;改变。不过,您用于执行更新的工具应该可以看到更改。 对你自己的回答说要放入 where 子句有点困惑,答案中有一个 where 子句。你能澄清一下吗? 是的,我不确定为什么你的代码突然对我有用。一定有某种错误。基本上发生的事情是,查询正在删除我表中的所有数据(当时只是那些 id 字段中的数据)。长话短说,我重新启动并且您的代码有效。感谢您的帮助【参考方案2】:

您可以在 update 中执行此操作,并且您可以将这种措辞与 insert 类似:

update new_table t
    set field1 = v.field1,
        field2 = v.field2,
        field3 = v.field3
    from ( (<id1>, 'value1', 'value2', 'value3'),
           (<id2>, 'value4', 'value5', 'value6')
         ) v(id, field1, field2, field3)
    where t.id = v.id;

&lt;id1&gt;&lt;id2&gt; 但是您将匹配定义为“前两行”。

【讨论】:

以上是关于填充行的其余部分/避免违反空约束的主要内容,如果未能解决你的问题,请参考以下文章

如何与第一个匹配行左连接并用空填充其余部分?

从 OLTP 关系数据库填充数据仓库

从 CSV 填充 postgres 表列时出现非空约束错误

如果违反了“应/不应”要求,那么该要求位于哪个部分(例如语义、约束)是不是重要?

违反约束时是不是可以获取行的值?

为什么Django引发IntegrityError:列“user_id”中的null值在提交表单时违反了非空约束?