【问题标题】:How to create clustered index on Foriegn Key-Sql Server如何在外键 SQL 服务器上创建聚集索引
【发布时间】:2015-01-21 20:23:42
【问题描述】:
如何在 SQL Server 的外键字段上创建聚集索引
ALTER TABLE [PERSON_MAIL] ADD
CONSTRAINT [PERSON_MAIL_Person_Id]
FOREIGN KEY CLUSTERED ([Person_Id])
REFERENCES PERSON_KEY(Person_Id)
当我执行上述查询时,出现“关键字'CLUSTERED'附近的语法不正确”之类的错误
谁能帮忙解决这个问题
【问题讨论】:
标签:
sql
.net
database
sql-server-2008
【解决方案1】:
创建主键时,您可以选择将 sql server 创建的索引设置为集群或非集群。
在创建外键时,sql server 不会创建索引,所以没有索引类型的选项。
您需要分别创建外键和索引。
alter table foo
add constraint fk_bar(bar_id) foreign key
references bar(id)
go
create clustered index ix_foo__bar_id
on foo(bar_id)
go
【解决方案2】:
这里是解决方案,如果您没有主键 PERSON_KEY:
CREATE CLUSTERED INDEX Idx_Person
ON PERSON_KEY (Person_Id);
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_PERSON_KEY
(
Person_Id int NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_PERSON_KEY SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.PERSON_KEY)
EXEC('INSERT INTO dbo.Tmp_PERSON_KEY (Person_Id)
SELECT Person_Id FROM dbo.PERSON_KEY WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.PERSON_KEY
GO
EXECUTE sp_rename N'dbo.Tmp_PERSON_KEY', N'PERSON_KEY', 'OBJECT'
GO
ALTER TABLE dbo.PERSON_KEY ADD CONSTRAINT
PK_PERSON_KEY PRIMARY KEY NONCLUSTERED
(
Person_Id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX Idx_Person ON dbo.PERSON_KEY
(
Person_Id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT
ALTER TABLE [PERSON_MAIL] ADD
CONSTRAINT [PERSON_MAIL_Person_Id]
FOREIGN KEY ([Person_Id])
REFERENCES PERSON_KEY(Person_Id)