2014-11-24 40 views
0

如何在SQL Server上的外键字段创建聚集索引如何Foriegn重点-SQL Server上创建聚集索引

ALTER TABLE [PERSON_MAIL] ADD 
    CONSTRAINT [PERSON_MAIL_Person_Id] 
    FOREIGN KEY CLUSTERED ([Person_Id]) 
    REFERENCES PERSON_KEY(Person_Id) 

当我执行上面的查询,得到错误像“关键字附近有语法错误“ CLUSTERED'“ 任何人都可以请求帮助

回答

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 
+0

我将测试它让你知道输出 – vmb 2014-11-24 09:03:17

+0

其working.whatü指出的是正确的 – vmb 2014-12-01 12:55:36

0

这里是解决办法,如果你没有在主键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)