Raj*_*tel 6 foreign-key sql-server partitioning sql-server-2012
我有一张桌子:
CREATE TABLE [dbo].[entry]
(
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[EntryDate] [datetime] NOT NULL,
[createddate] [datetime] NOT NULL,
CONSTRAINT [PK_Entry_ID] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
WITH
(
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80
) ON [PRIMARY]
) ON [PRIMARY];
Run Code Online (Sandbox Code Playgroud)
...其中主键被另一个表引用。为了对这个表进行分区,我已经完成了以下步骤:
CREATE PARTITION FUNCTION EntryFunc (DATE)
AS RANGE LEFT
FOR VALUES ('2011-01-01')
CREATE PARTITION SCHEME EntryScheme
AS PARTITION EntryFunc
TO ([FileGroup2], [PRIMARY])
Run Code Online (Sandbox Code Playgroud)
以上 2 个步骤成功完成,但是当我对表进行分区时,我无法删除主键聚集索引,因为它被其他表引用。我的动机是根据创建日期对表条目进行分区。
来自 BOL ( http://technet.microsoft.com/en-us/library/ms191160(v=sql.105).aspx )
源表和目标表必须具有相同的 FOREIGN KEY 约束。如果目标表有任何 FOREIGN KEY 约束,则源表必须具有在相应列上定义的相同外键,并且这些外键必须引用与目标表相同的主键。源表的外键不能标记为is_not_trusted(在sys.foreign_keys目录视图中可以查看),除非目标表对应的外键也标记为is_not_trusted。
所以如果你想对一个外键引用的表进行分区,那么两个表都需要有相同的FK。
同样对于快速分区,以下规则适用:
你不能使用 fk 的
如果源表具有主键,则未定义主键/外键。源表和源表保存主键的目标表之间不能存在活动的主键/外键关系。
如果目标表具有外键,则未定义主键/外键。源表和目标表保存外键的目标表之间不能有活动的主键/外键关系。
来自另一个表的任何外键都不能引用源表。源表不能被另一个表中的外键引用。
因此,您必须删除约束,对表进行分区并重新创建成本约束。最好作为一个事务来做,所以成功时它可以提交,或者失败时它可以回滚。
可以在以下位置找到分步教程:http : //www.mssqltips.com/sqlservertip/2888/how-to-partition-an-existing-sql-server-table/ 和
http://www.confio.com/logicalread/sql-server-primary-key-vs-clustered-index,-part-3/#.Ui1lNGIpDFo