ON [PRIMARY]是什么意思?

Ico*_*123 226 sql database sql-server database-design

我正在创建一个SQL安装脚本,我正在使用别人的脚本作为示例.这是脚本的一个例子:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[be_Categories](
    [CategoryID] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_be_Categories_CategoryID]  DEFAULT (newid()),
    [CategoryName] [nvarchar](50) NULL,
    [Description] [nvarchar](200) NULL,
    [ParentID] [uniqueidentifier] NULL,
 CONSTRAINT [PK_be_Categories] PRIMARY KEY CLUSTERED 
(
    [CategoryID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

有谁知道ON [PRIMARY]命令有什么作用?

blo*_*art 231

在Microsoft SQL Server中创建数据库时,您可以拥有多个文件组,其中存储在多个位置,目录或磁盘中创建.可以命名每个文件组.PRIMARY文件组是默认文件组,它始终是创建的,因此您给出的SQL会在PRIMARY文件组上创建表.

有关完整语法,请参阅MSDN.

  • 这也意味着它通常是**无用的,可以从脚本中安全地删除**. (145认同)
  • @MarkSowul除非你有充分的理由使用它来优化性能,是的,可以省略它并让默认发生.(因此包含"通常"MGOwen.)将变量初始化为"0"或"假"是关于确保代码在已知状态下运行,这是一个逻辑和正确性问题,而不是优化问题. (12认同)
  • 我在脚本中看到了两次`ON PRIMARY`语法 - 一个用于表,另一个用于表约束.在存储方面存在表约束的情况下它意味着什么?这对我来说听起来无关紧要或多余.从语法上讲,它应该足以在表级别提一次,或者是否真的可以将表存储在NON-PRIMARY文件组上的PRIMARY文件组和表约束数据上? (3认同)
  • 这是实际的 [MSDN](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql) 链接。答案中的那个不再有效,我无法编辑帖子! (2认同)

cod*_*ger 37

它指的是您创建的对象所在的文件组.因此,您的主文件组可以驻留在服务器的驱动器D:\上.然后,您可以创建另一个名为Indexes的文件组.此文件组可以驻留在服务器的驱动器E:\上.


Mar*_* S. 16

ON [PRIMARY]将在"Primary"文件组上创建结构.在这种情况下,主键索引和表将放在数据库中的"主"文件组中.


RBT*_*RBT 7

为Mark S.在帖子中提到的内容添加一个非常重要的注释.在问题中提到的特定SQL脚本中,您永远不会提到两个不同的文件组来存储数据行和索引数据结构.

原因是由于在这种情况下创建的索引是主键列上的聚簇索引.表的聚簇索引数据和数据行永远不能位于不同的文件组中.

因此,如果您的数据库上有两个文件组,例如PRIMARY和SECONDARY,那么下面提到的脚本会将您的行数据和聚簇索引数据存储在PRIMARY文件组本身上,即使我已经[SECONDARY]为表数据提到了不同的文件组() .更有趣的是,脚本也成功运行(当我期望它给出错误时,因为我给出了两个不同的文件组:P).SQL Server默默地,巧妙地完成了场景背后的技巧.

CREATE TABLE [dbo].[be_Categories](
    [CategoryID] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_be_Categories_CategoryID]  DEFAULT (newid()),
    [CategoryName] [nvarchar](50) NULL,
    [Description] [nvarchar](200) NULL,
    [ParentID] [uniqueidentifier] NULL,
 CONSTRAINT [PK_be_Categories] PRIMARY KEY CLUSTERED 
(
    [CategoryID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [SECONDARY]
GO
Run Code Online (Sandbox Code Playgroud)

注意:如果正在创建的索引本质上是非群集的,则索引可以驻留在不同的文件组上.

[SECONDARY]当表数据已经驻留在[PRIMARY]文件组上时,将在文件组上创建以下创建非聚集索引的脚本:

CREATE NONCLUSTERED INDEX [IX_Categories] ON [dbo].[be_Categories]
(
    [CategoryName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Secondary]
GO
Run Code Online (Sandbox Code Playgroud)

您可以获得有关如何在不同文件组上存储非聚簇索引可以帮助您的查询更好地执行的更多信息.是一个这样的链接.