填充行的其余部分/避免违反空约束
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;
<id1>
和 <id2>
但是您将匹配定义为“前两行”。
【讨论】:
以上是关于填充行的其余部分/避免违反空约束的主要内容,如果未能解决你的问题,请参考以下文章