我正在创建一个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]命令的作用吗?
答案 0 :(得分:218)
在Microsoft SQL Server中创建数据库时,您可以拥有多个文件组,其中存储在多个位置,目录或磁盘中创建。可以命名每个文件组。 PRIMARY文件组是默认文件组,它始终是创建的,因此您给出的SQL会在PRIMARY文件组上创建表。
有关完整语法,请参阅MSDN。
答案 1 :(得分:37)
它指的是您创建的对象所在的文件组。因此,您的主文件组可以驻留在服务器的驱动器D:\上。然后,您可以创建另一个名为Indexes的文件组。该文件组可以驻留在服务器的驱动器E:\上。
答案 2 :(得分:15)
ON [PRIMARY]将在“Primary”文件组上创建结构。在这种情况下,主键索引和表将放在数据库中的“主”文件组中。
答案 3 :(得分:6)
为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
注意:只有在创建的索引本质上是非群集时,您的索引才能驻留在不同的文件组中。
当表数据已经驻留在[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
您可以获得有关如何在不同文件组上存储非聚集索引可以帮助您的查询更好地执行的更多信息。 Here就是这样一个链接。