插入查询将null插入第1列而不是将数据插入指定列

时间:2013-12-17 20:49:01

标签: sql sql-server sql-server-2008 tsql

我正在尝试执行一个简单的插入,并且出于某种原因,它试图将空值插入第1列,而不是将数据插入到我在查询中指定的列中。

INSERT INTO EquipInfo (OrgID)
SELECT OrgID from Org_Import

无法将值NULL插入列'MAC',表'C:\ ILoveYouStackOverFlow \ Inventory.MDF.dbo.EquipInfo';列不允许空值。 INSERT失败。

EquipInfo表已经到位,MAC是主键,并且是唯一不允许空值的列。我的Org_Import表有一列,其中没有空值。

我是否必须为每一列提供一个值?我基本上只想将Org_Import中的OrgID附加到EquipInfo的末尾。

我想要做的就是在EquipInfo表的末尾添加一个新列。 MAC是MAC地址的缩写,它将控制vlan上的网络访问。

4 个答案:

答案 0 :(得分:2)

错误非常明确:EquipInfo有一个名为MAC的列,但是您的INSERT语句没有为其提供值。你需要提供一个;要么是常数:

INSERT INTO EquipInfo (MAC, OrgID)
SELECT 0 as MAC, OrgID from Org_Import -- Assuming MAC is numeric

或者,作为Org_Import的值:

INSERT INTO EquipInfo (MAC, OrgID)
SELECT MAC, OrgID from Org_Import -- Assuming MAC is in Org_Import

当然,您也可以删除NOT NULL上的EquipInfo.MAC约束:

ALTER TABLE EquipInfo ALTER COLUMN MAC whateverTypeMACIs NULL

或者给它一个默认值:

ALTER TABLE EquipInfo ADD DEFAULT 0 FOR MAC -- Assuming MAC is numeric

答案 1 :(得分:2)

更密切地阅读错误消息

  

无法将值插入“MAC”列

看起来你在EquipInfo表中有另一个名为MAC的列,它不允许空值。

两个选项:
(1)将它添加到insert语句并为其赋值;或
(2)更改MAC字段以允许空值 (3)在MAC字段上添加默认值

答案 2 :(得分:1)

您的主键(MAC)似乎未设置为自动增量字段。我强烈建议添加它。否则,您将不得不想办法以1)不与现有值冲突的方式生成新的主键值,2)不允许并发插入添加重复键。

答案 3 :(得分:1)

正如其他人所说,您的数据库表至少有一个其他列MAC,它具有一致性约束,不能为NULL。但是,所有其他答案都建议了解除约束的方法(例如,允许NULL,设置默认值或垃圾值)。我相信这些答案是不负责任的。

如果您的数据库有约束,您应该认为它存在的原因很充分(防止出现异常,强制执行外键等)。如果你做了违反约束的事情,你的第一个冲动应该是满足约束,而不是绕过约束。

在你的情况下,你应该找出MAC是什么;它是外键吗?然后确定具有SELECT OrgID from Org_Import的记录的外键值应该是什么,并插入它。它是主键吗?然后使MAC成为自动增量键。别的什么?找出本专栏中的内容,不要试图绕过数据库的完整性。