【问题标题】:Query regarding SQL Insert in SQL Server?查询有关 SQL Server 中的 SQL 插入?
【发布时间】:2009-12-15 16:56:21
【问题描述】:

我正在使用 SQL Server 2008 并开发一个处于维护阶段的项目。

我想在主键是整数但不是标识的表中插入记录。例如表名是tblFiles,字段是ID, FileName, FileContent

实际上该表正在使用中,所以我不想对其进行任何架构更改。我想要插入行后的键,因为我必须把它放在另一个表中。 Id 列中的现有值是不同的整数,表示不按顺序排列。

所以我想要查询也返回 Id 值。所以我只想插入 FileNameFileContent 以及某种可以嵌入到我的插入查询中的 sql,它插入一个唯一的 ID 并向我发送该 ID

【问题讨论】:

  • ID 列是否至少存在唯一性约束?
  • 好吧,如果它是主键,那不是自动暗示唯一性吗??
  • 是什么为您生成“ID”?

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


【解决方案1】:

好吧,如果它不是 IDENTITY 字段 - 您是否必须在插入中指定“ID”才能使其成功?如果是这样 - 您已经拥有该 ID!或者我错过了什么? ID是由触发器还是什么决定的??

如果是这样,试试这个查询:

INSERT INTO dbo.tblFiles(FileName, FileContent)
OUTPUT inserted.ID
VALUES ('yourfile.name', 'your contents')

这应该从 INSERT 查询返回新插入的 ID。

马克

【讨论】:

  • 我认为他正在寻找一个自动生成的 ID,而无需更改架构。
  • @womp:好的,在这种情况下,我可能会添加一个带有 INT IDENTITY 字段的帮助表,并在那里插入一个虚拟行并获取新的自动生成的 ID,然后在 @ 987654323@表
  • @Marc;谢谢,我已经发布了我的答案,因为我已经发布了我的最终查询,您的答案帮助我构建最终查询,我正在标记您的答案。
【解决方案2】:

将列标识规范 > Is Identity 更改为 Yes。

插入表格后就可以了

Select SCOPE_IDENTITY() 

获取刚刚添加的整数并在您的 SP 中返回它。

如果您确实无法编辑数据库架构,也许您可​​以将另一个表添加到数据库中,该表具有两个名为 ID 和 CurrentDate 的列。将 ID 列设为身份。在您的代码中插入此表中,首先选择 SCOPE_IDENTITY(),然后使用返回的整数作为 tblFles 表中的 ID 插入。

附:不要在你的桌子前加上 tbl 那是 1999 年的事了。:)

【讨论】:

  • pps:我们应该开始用“T_”作为表的前缀吗? ;-)
【解决方案3】:

您可以使用

创建一个唯一的整数,但并不那么优雅

从 tblFiles 中选择 MAX(ID) + 1

并根据情况从您的查询或存储过程中简单地返回它。否则按照 marc_s 所说的,如果它已经知道的话。

更新:不得不说,我强烈建议不要按要求使用这种软糖,而是强烈建议您努力推后并更改表,因此这是一个身份列,因为这是什么。到目前为止,所有答案都只是软糖,尤其是我的。

【讨论】:

  • 在繁忙的多用户系统中,这确实是一个非常糟糕的设计 - 你绝对保证在没有时间之后就会有重复......跨度>
  • @marc_s 同意你的观点,但需要知道这是否是一个繁忙的系统,或者此插入可能存在表锁。如果我站在他的立场上,我会简单地推动应用身份,而不是任何这些软糖。我想我会回答这个......
  • @marc_s 顺便说一句,如果它是主键,则不可能重复,但诚然,如果没有锁到位,您在尝试插入时会出错。
  • @dove: true - 主键可以防止重复 - 但您可能会遇到难以查找和追踪的错误。我同意 - 只是简单地使用 IDENTITY 将是迄今为止最简单的解决方案......
【解决方案4】:

所以我的最终查询看起来像......

Insert into dbo.tblData (Id, FName, LName) 
output inserted.Id
values ((SELECT MAX(ID) + 1 FROM dbo.tblData), 'xyz', 'abc')

【讨论】:

    【解决方案5】:

    我们可以将 max(ID)+1 赋给一个整数变量,然后我们可以插入

    Declare @ID int
    Select @ID = ISNULL(MAX(ID),0) + 1 FROM tblFiles
    
    INSERT INTO tblFiles 
    (
      ID, FileName, FileContent
    )
    Select @ID,'FileName','FileContent'
    

    这个插入是直接的,

    INSERT INTO tblFiles 
    (
      ID, FileName, FileContent
    )
     Select (Select ISNULL(MAX(ID),0) + 1 FROM tblFiles),'FileName','FileContent'
    

    这里我们必须使用 ISNULL 条件,因为表中没有数据,那么它将返回 Null。所以 ISNULL(MAX(ID),0) + 1 这个条件会给出 Data is null then 0+1=1.

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多