当前位置: 首页 > 面试题库 >

如何插入到使用顺序GUID作为主键的表中?

邹野
2023-03-14
问题内容

这是我正在查看的表的简化版本:

CREATE TABLE [dbo].[FrustratingTable]
(
    [Id] Uniqueidentifier NOT NULL
    , [SecondField] [datetime]
    , [ThirdField] varchar(128)
)

我想在此表中插入新记录。我尝试了3种方法:

INSERT INTO [dbo].[FrustratingTable] (Id, SecondField, ThirdField)
    SELECT newid() as Id, 
           '6/25/2015' as SecondField, 'Example' as ThirdField

这种方法会插入,但是生成的键与表中的其他键不同,不是一个很好的顺序GUID

INSERT INTO [dbo].[FrustratingTable] (Id, SecondField, ThirdField)
SELECT NEWSEQUENTIALID() as Id, '6/25/2015' as SecondField, 'Example' as ThirdField

这失败并显示错误

newsequentialid()内置函数只能在CREATE TABLE或ALTER
TABLE语句中的’uniqueidentifier’类型的列的DEFAULT表达式中使用。它不能与其他运算符组合以形成复杂的标量表达式。

INSERT INTO [dbo].[FrustratingTable] (SecondField,ThirdField)
SELECT '6/25/2015' as SecondField, 'Example' as ThirdField

失败并显示错误

无法将值NULL插入表“ mydatabase.dbo.frustratingtable”的列“ id”中;列不允许为空。INSERT失败。

是否可以在不更改表定义的情况下解决此问题?


问题答案:

您可以通过使用表变量来执行此操作:

declare @t table (
    ID uniqueidentifier not null default newsequentialid(),
    SecondField datetime,
    ThirdField varchar(128)
)
insert into @t (SecondField,ThirdField)
    output inserted.ID,inserted.SecondField,inserted.ThirdField
    into FrustratingTable
values
('20150101','abc'),
('20150201','def'),
('20150301','ghi')

select * from FrustratingTable

结果:

Id                                   SecondField             ThirdField
------------------------------------ ----------------------- ------------
1FEBA239-091C-E511-9B2F-78ACC0C2596E 2015-01-01 00:00:00.000 abc
20EBA239-091C-E511-9B2F-78ACC0C2596E 2015-02-01 00:00:00.000 def
21EBA239-091C-E511-9B2F-78ACC0C2596E 2015-03-01 00:00:00.000 ghi

由于table变量通过a设置值default,因此我们可以使用NEWSEQUENTIALID()

当然,对于非常大的数据集,暂时隐藏两个数据副本是有代价的。

一种替代方法是使用一个较旧的解决方案,称为COMB,该解决方案在NEWSEQUENTIALID()引入之前就已经使用过:

SELECT CAST(CAST(NEWID() AS BINARY(10)) + CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)

生成uniqueidentifiersNEWID()其本身具有更好的局部性。



 类似资料:
  • 问题内容: 我将几个引用的表与整数主键一起使用。现在,我想将int更改为GUID,保留所有引用不变。最简单的方法是什么? 谢谢! 添加 我确实了解该过程,所以我需要更详细的建议,例如,如何填充新的GUID列。使用默认值newid()是正确的,但是对于已经存在的行呢? 问题答案: 在主表中为guid值创建一个新列。使用uniqueidentifier数据类型,并使其不为null,并使用newid()

  • 我正在尝试使用单个表将数据插入到不同的表中,并且我正在插入的表具有主键。

  • 问题内容: 我正在使用多视图索引来插入新闻详细信息。在第一个视图中,用户可以输入新闻的详细信息,然后单击下一步按钮将其插入db。第二个视图中,用户可以添加新闻的图像(仅允许3张图像), 我遇到的问题是,第一个视图将数据插入具有主键newsID的表dbo.newsdetail中,而第二个视图应使用刚刚添加到newsimages表中的新闻的newsId添加受尊重的图像。我只是不知道如何获取在第一个视图

  • 问题内容: 我将主键设置为自动递增。 我正在执行多个查询,我需要检索该主键值以用作另一个表()中的外键。 当我执行插入查询时,是否有任何优雅的方法来获取主键值?现在,我正在重新查询并获得该列中的最高价值,这似乎真的很棘手。 有什么建议? 问题答案: 通过scope_identity()获得新的PK

  • 我有一个UITextView和一个带有UIPuttons的scrollView,现在我想把那些放在scrollView中的UIPuttons添加到UITextView中。现在,每次执行时,它会将所有的uibuttons添加到同一个第一位置,并且会重载彼此。下面是它的样子:链接

  • 我有两个表,其中主键(另一个表上的外键)在运行时自动递增(使用TOAD for mysql)。如何使用事务将数据同时插入两个表中。 这是第一个表的ddl: 第二个表的ddl: 注意:主要的挑战是从主键上获取自动递增的键值,以便在运行时插入到另一个表中。 提前谢谢。