【问题标题】:SQL Server: "Cannot insert the value NULL into column" - on identity columnSQL Server:“无法将值 NULL 插入列” - 在标识列上
【发布时间】:2014-10-28 13:47:00
【问题描述】:

我正在将数据插入到具有名为unique_id 的标识列的表中。我将 unique_id 列排除在插入之外,假设该值将从列上的标识配置中播种。

Insert声明:

INSERT INTO table_name (column_1, column_2, column_3, processed_dt)
VALUES ('A', 'B', 'C', GETDATE());

错误:

无法将值 NULL 插入列“unique_id”、表“db.dbo.table_name”;列不允许空值。插入失败。

当我在 SQL Server Management Studio 中双击 unique_id 列时,我看到设置了以下值:

  • 身份:真实
  • 身份种子:1
  • 标识增量:1

还有哪些其他配置错误导致无法自动使用身份种子?

更新:

根据我看到的一些建议,我想补充一点,我们的供应商已将此架构从 Oracle 转换为 SQL Server。我猜该过程的一部分必须包括将 Oracle Sequences 转换为 SQL Server Identity 列。身份列“损坏”肯定是有可能的。

我肯定在正确的数据库、表和列上。此列中的 Identity 不是今天创建的,而是几周前创建的。

供应商是否可以进行任何配置来禁用种子值的自动分配并强制开发人员手动“获取”下一个种子值?

【问题讨论】:

  • 看来设计师一定是在告诉你错误的信息。定义已过时,因为它打开后在外部发生了更改,或者您进行了未保存的更改,或者您正在查看错误的对象。该列不能设置标识。
  • 或者,我认为触发器中将identity insert设置为on并插入显式null的代码可能会导致这种情况。
  • @MartinSmith 说了什么。要么是一些微妙的错误,要么是异常数据库工件/事件的不太可能的组合。
  • 使用 Profiler 跟踪正在执行的确切 SQL 语句。它们可能不是您所期望的。并确保您正在查看正确的 table/db/server。
  • 你能看看Select ident_seed('table_name'), ident_incr('table_name')返回了什么吗?

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

SQL Server 存储要使用的种子/nextID 值。我想知道 Oracle 的转换是否忽略了设置该值。尝试在该表上使用以下命令来检查它的种子值是什么:

DBCC CHECKIDENT ( table_name, NORESEED )

也许它实际上是空的,这导致了错误。然后,您可以使用同一命令的变体来“重新播种”或设置要使用的下一个值。

有关更多信息和选项: http://msdn.microsoft.com/en-us/library/ms176057(v=sql.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    相关资源
    最近更新 更多