【问题标题】:Insert into query inserting null into 1st column instead of data into specified column插入查询,将空值插入第一列,而不是将数据插入指定列
【发布时间】:2013-12-17 20:49:01
【问题描述】:

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

INSERT INTO EquipInfo (OrgID)
SELECT OrgID from Org_Import

无法将值 NULL 插入到列“MAC”、表“C:\ILoveYouStackOverFlow\Inventory.MDF.dbo.EquipInfo”中;列不允许空值。插入失败。

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

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

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

【问题讨论】:

  • 请告诉我们您的表架构。
  • 您的表格是否有超过 1 个字段?您没有从错误中为字段“MAC”指定任何值,因此它将尝试为该字段插入 null。
  • 该表有 18 列 2500 多个字段。
  • 你可能是指 2500 对吧?

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


【解决方案1】:

错误很明显: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 NULLEquipInfo.MAC 的约束:

ALTER TABLE EquipInfo ALTER COLUMN MAC whateverTypeMACIs NULL

或者给它一个默认值:

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

【讨论】:

  • 我在看这个,我想我可以在表的末尾插入,而不必弄乱任何其他数据。 stackoverflow.com/questions/13386894/sql-server-insert-example
  • INSERT 将在表中创建新行。这是你想要做的吗?如果是这样,这些新行将需要遵循表架构的约束,例如包含任何必需的值。
  • 不,我不想创建新行。我只希望我的 EquipInfo 表末尾有 OrgID。我应该使用什么命令?
  • 您正在尝试向表中添加新列?
  • 是的,我不想触摸 MAC 列,因为它包含我所有的 MAC 地址,这将控制网络访问。如果一切都失败了,我将使用新的更改正确地重建它。
【解决方案2】:

仔细阅读错误信息

无法将值 NULL 插入“MAC”列

看起来您在 EquipInfo 表中还有一个名为 MAC 的列不允许空值。

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

【讨论】:

  • (3) 将 MAC 字段更改为默认值
  • MAC 是一个 CHAR(25)(MAC 地址),它将控制网络访问。默认值 00-00-00-00-00-00 会带来安全风险吗?
  • 我不知道。我不知道你的应用程序是做什么的。如果您担心,只需使其不需要值并将其保留为空。
  • 这是一个库存应用程序,用于跟踪设备。我有一个开关,它将根据数据库中的内容查看文件,并确定谁可以上网。
  • @user3089119,如果您没有创建数据库架构,那么最好找出该列具有 NOT NULL 约束的原因。如果您不知道它们的用途,那么到处删除数据和约束确实是不负责任的;也许它们是数据库完整性或安全性所必需的。如果您进行调查并且确实不需要约束,请考虑将其删除,但这应该是您最后的手段,而不是您的第一个手段。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    如果您的数据库有约束,您应该假设它存在是有充分理由的(防止异常、强制外键等)。如果你做了违反约束的事情,你的第一个冲动应该是满足约束,而不是规避它。

    在您的情况下,您应该找出MAC 是什么;是外键吗?然后确定带有SELECT OrgID from Org_Import 的记录的外键值应该是什么并插入它。是主键吗?然后将MAC 设为自动递增键。还有什么?找出本专栏应该包含的内容,不要试图规避您的数据库完整性。

    【讨论】:

    • 我想我只是要删除所有内容,编辑我的构建脚本,然后再次批量插入我的所有数据。
    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多