ON 是什么意思?

我正在创build一个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 

有谁知道ON [PRIMARY]命令是干什么的?

在Microsoft SQL Server中创build数据库时,可以有多个文件组,其中在多个位置,目录或磁盘中创build存储。 每个文件组都可以被命名。 PRIMARY文件组是默认的文件组,它总是被创build的,所以你赋予的SQL在PRIMARY文件组上创build你的表。

请参阅MSDN的完整语法。

它指您正在创build的对象驻留在哪个文件组上。 因此,您的主文件组可以驻留在您的服务器的驱动器D:\上。 您可以创build另一个名为Indexes的文件组。 该文件组可以驻留在服务器的驱动器E:\上。

ON [PRIMARY]将在“主”文件组上创build结构。 在这种情况下,主键索引和表将被放置在数据库中的“主”文件组上。

对马克·S在他的文章中提到的一个非常重要的说明。 在问题中提到的特定SQL脚本中,您永远不会提及两个不同的文件组来存储您的数据行和索引数据结构。

原因是因为在这种情况下创build的索引是主键列上的聚集索引。 您的表的聚簇索引数据和数据行不能在不同的文件组上

因此,如果你的数据库有两个文件组,比如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 

注意: 如果所创build的索引本质上是非群集的,则您的索引可以位于不同的文件组中

创build非聚集索引的下面的脚本将在[SECONDARY]文件组上创build,而当表数据已经驻留在[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 

您可以获得有关如何将非聚集索引存储在不同文件组中的更多信息可以帮助您的查询执行得更好。 下面是一个这样的链接:

https://dba.stackexchange.com/questions/2626/when-should-nonclustered-indexes-be-stored-on-separate-filegroups