【问题标题】: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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-20
      • 2021-01-14
      • 2022-01-04
      • 2018-04-22
      • 2012-11-26
      • 1970-01-01
      • 2020-05-08
      • 2015-10-10
      相关资源
      最近更新 更多