这是我正在查看的表的简化版本:
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)
生成uniqueidentifiers
比NEWID()
其本身具有更好的局部性。
问题内容: 我将几个引用的表与整数主键一起使用。现在,我想将int更改为GUID,保留所有引用不变。最简单的方法是什么? 谢谢! 添加 我确实了解该过程,所以我需要更详细的建议,例如,如何填充新的GUID列。使用默认值newid()是正确的,但是对于已经存在的行呢? 问题答案: 在主表中为guid值创建一个新列。使用uniqueidentifier数据类型,并使其不为null,并使用newid()
我正在尝试使用单个表将数据插入到不同的表中,并且我正在插入的表具有主键。
问题内容: 我正在使用多视图索引来插入新闻详细信息。在第一个视图中,用户可以输入新闻的详细信息,然后单击下一步按钮将其插入db。第二个视图中,用户可以添加新闻的图像(仅允许3张图像), 我遇到的问题是,第一个视图将数据插入具有主键newsID的表dbo.newsdetail中,而第二个视图应使用刚刚添加到newsimages表中的新闻的newsId添加受尊重的图像。我只是不知道如何获取在第一个视图
问题内容: 我将主键设置为自动递增。 我正在执行多个查询,我需要检索该主键值以用作另一个表()中的外键。 当我执行插入查询时,是否有任何优雅的方法来获取主键值?现在,我正在重新查询并获得该列中的最高价值,这似乎真的很棘手。 有什么建议? 问题答案: 通过scope_identity()获得新的PK
我有两个表,其中主键(另一个表上的外键)在运行时自动递增(使用TOAD for mysql)。如何使用事务将数据同时插入两个表中。 这是第一个表的ddl: 第二个表的ddl: 注意:主要的挑战是从主键上获取自动递增的键值,以便在运行时插入到另一个表中。 提前谢谢。
我有一个UITextView和一个带有UIPuttons的scrollView,现在我想把那些放在scrollView中的UIPuttons添加到UITextView中。现在,每次执行时,它会将所有的uibuttons添加到同一个第一位置,并且会重载彼此。下面是它的样子:链接