IDENTITY_INSERT 设置为 OFF 的问题? :-/

Posted

技术标签:

【中文标题】IDENTITY_INSERT 设置为 OFF 的问题? :-/【英文标题】:Problems with IDENTITY_INSERT Set to OFF? :-/ 【发布时间】:2011-10-02 12:28:59 【问题描述】:

我正在尝试将订单详细信息插入我的数据库,但它一直在说:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“订单”中的标识列插入显式值。

我要做的只是将用户 UserId 插入到 UserId 列中,使用 WebSecurity.CurrentUserId - 为什么这不起作用?

我有:

dbase.Execute("INSERT INTO Orders 
                 (UserId, OrderId, Status) 
               VALUES 
                 (@0, @1, @2)", 
               WebSecurity.CurrentUserId, 
               Session["OSFOID"], 
               "Confirmed");`

所以,如您所见,它非常简单。但是,为什么它不起作用?

我的表定义是:

【问题讨论】:

系统确实允许回头客。 orders 表仅用于临时存储信息。 抱歉,这个数据模型对我来说意义不大...... 此数据模型基于他拥有的客户现有的 Access 数据库。很抱歉这没有任何意义,我知道它需要改变,但这不是他现在愿意改变的事情,因为他“太忙”了其他工作。 其实,因为我大部分时间都无聊得要死,我想如果他允许我的话,我可能会考虑自己改变它。 @OMG - 无需抱歉。 :) 感谢您在这几个月里给予我的所有帮助 【参考方案1】:

除非您启用进行身份插入的能力(通过为该表设置身份插入on),否则不允许触摸该列 - 数据库拥有它。

要么启用身份插入简要,要么:不要尝试插入 UserId(让数据库创建一个新 id)。

根据在线书籍,SET IDENTITY_INSERT

SET IDENTITY_INSERT Orders ON
INSERT INTO Orders (UserId, OrderId, Status) VALUES (@0, @1, @2)
SET IDENTITY_INSERT Orders OFF

但更有可能的是:如果这是 Orders 表,那么标识不应该在 OrderId 上吗?当然,由于您试图控制OrderId,您仍然会遇到同样的问题。

【讨论】:

我明白这一点。但是,我还有另一个具有相同定义的表。我可以插入没有问题。 我没有创建新的 ID。我正在插入一个现有的。 @jase - 不,你没有。这显然不是同一个定义,否则你会得到同样的错误。一定有区别。 @jase - 就 that table 而言,它不关心该数字是否存在于其他地方。重新“具有相同定义的另一个表” - 然后要么该表没有IDENTITY,或者您已经在该表上启用了IDENTITY_INSERT @jase - 如果您要插入现有 ID,则不应将该列定义为身份字段。 Identity 字段会自动生成其 ID,并且(通常)不允许插入。【参考方案2】:

通常您不希望将整数插入主键列。通常,只有在您希望 SQL Server 在插入时将自动递增整数设置到该列中时,您才会将该列的“标识”标志设置为 true。

与 Marc Gravell 的回答一样,您可以使用启用身份插入

SET IDENTITY_INSERT [ database. [ owner. ] ]  table   ON | OFF 

但是在常规应用程序代码中这样做确实很不健康——您最终会遇到并发问题并且很可能会出现重复身份。更好的是,不要插入订单的 ID - 让数据库自动为您完成,然后只需使用 @@IDENTITY(或者更好,SCOPE_IDENTITY())查询新 ID。

如果出于某种原因您确实需要存储用户的会话 ID,请将其设置为 order 表中的单独列,或者更好的是,在单独的 User 表中,UserId 是外键。

【讨论】:

【参考方案3】:

您不希望 UserID 成为身份,我也不认为您希望 UserID 成为主键。您很可能希望 OrderID 成为主键,或者最多与 userid 和 orderid 共享主键。

【讨论】:

【参考方案4】:

在您的表定义中将Is Identity? 设置为False,没有设置您不能手动向UserID 插入值

【讨论】:

可以,并且错误信息已经告诉你如何...更改IDENTITY不可掉以轻心-当然目前完全有可能是错误(但这与盲目删除它不同)【参考方案5】:

您已将 IS Identity 设置为 YES,这就是为什么现在您无法为此列插入值 DB 将通过递增值自动插入它..

我看到你将 UserId 设置为表的主键是错误的 Order OoderID 应该是列的主键。

将 UserID IsIdentify 设置为 false 并将 OrderID IsEdentitfy 设置为 yes 并将其设为主键列。

【讨论】:

【参考方案6】:

有趣的是,我发现当我使用“Select.....Into [new table] from [tables contains data]”创建表时,我随后无法插入新记录,将 Insert_Identity 设置为 off 消息。 我通过删除表然后使用创建表脚本来重建它来解决这个问题,现在根据需要插入尽可能多的新 ID 没有问题

【讨论】:

以上是关于IDENTITY_INSERT 设置为 OFF 的问题? :-/的主要内容,如果未能解决你的问题,请参考以下文章

错误 IDENTITY_INSERT 设置为 OFF 但实际上它是 ON

IDENTITY_INSERT 设置为 OFF - 如何将其打开?

[解决方案] 当 IDENTITY_INSERT 设置为 OFF 时

无法插入显式值,因为 IDENTITY_INSERT 为 OFF,但无法将 IDENTITY_INSERT 设置为 ON,因为它已经为 ON

当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值

异常为"当IDENTITY_INSERT设置为OFF时" 解决办法