Aar*_*and 4 sql t-sql sql-server sql-insert
我有一个带有自动生成的 ID 列的表(仅此而已!)
CREATE TABLE [dbo].[EmailGroup](
[EmailGroupGuid] [uniqueidentifier] NOT NULL
CONSTRAINT [PK_EmailGroup] PRIMARY KEY CLUSTERED ([EmailGroupGuid] ASC)
) ON [PRIMARY]
ALTER TABLE [dbo].[EmailGroup]
ADD CONSTRAINT [DF_EmailGroup_EmailGroupGuid] DEFAULT (newsequentialid()) FOR [EmailGroupGuid]
Run Code Online (Sandbox Code Playgroud)
我想插入到这个表中并提取生成的 ID。但是,我不知道是否可能。它似乎在抱怨缺少值/列。
DECLARE @Id TABLE (Id UNIQUEIDENTIFIER)
INSERT INTO EmailGroup
OUTPUT inserted.EmailGroupID INTO @Id
Run Code Online (Sandbox Code Playgroud)
有什么办法可以做到这一点吗?我的意思是我可以在表中添加一个虚拟列并轻松执行此操作:
INSERT INTO EmailGroup (Dummy)
OUTPUT inserted.EmailGroupID INTO @Id
VALUES (1)
Run Code Online (Sandbox Code Playgroud)
但我真的不想。
我也可以指定我自己的 ID 并插入它,但我又不想这样做。
虽然我不确定您为什么需要这样一个表,但您问题的答案是使用关键字DEFAULT:
INSERT INTO EmailGroup (EmailGroupGuid)
OUTPUT inserted.EmailGroupGuid INTO @Id
VALUES(DEFAULT);
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用DEFAULT VALUES,如 Pawan Kumar 的答案所示。
这两个选项之间的主要区别在于,指定列列表并使用关键字default可以为您提供更多控制。
当表只有一列时,这似乎没什么大不了的,但是如果您要向表中添加列,并且想要向其中插入特定值,则 usingdefault values将不再是有效的选项。
来自 Microsoft 文档INSERT(Transact-SQL):
默认
强制数据库引擎加载为列定义的默认值。
如果该列不存在默认值并且该列允许空值,则插入 NULL。对于使用时间戳
数据类型 定义的列,将插入下一个时间戳值。 DEFAULT 对于标识列无效。
默认值
强制新行包含为每列定义的默认值。
正如您所看到的,default是基于列的,而default values基于行的。
| 归档时间: |
|
| 查看次数: |
1191 次 |
| 最近记录: |