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