代码之家  ›  专栏  ›  技术社区  ›  Karmic Coder

外键是否在SQL Server中自动编制索引?

  •  61
  • Karmic Coder  · 技术社区  · 17 年前

    数据库引擎是SQL Server 2000

           CREATE TABLE [Table1] (
    . . .
                CONSTRAINT [FK_Table1_Table2] FOREIGN KEY 
                (
                    [Table1Column]
                ) REFERENCES [Table2] (
                    [Table2ID]
                )
    
            )
    
    3 回复  |  直到 17 年前
        1
  •  64
  •   Charles Bretana    15 年前

    SQL Server不会自动在外键上创建索引。同样来自MSDN:

    外键约束不存在 仅链接到主键 另一个表中的约束;它可以 也可以定义为引用 中唯一约束的列 另一张桌子。外键 约束可以包含空值; 外键约束包含null 值,所有值的验证 组成外键的 跳过约束。确定 所有的价值观都是复合的 验证密钥约束后,指定 柱。

        2
  •  22
  •   Charles Bretana    16 年前

    (编辑:添加以明确处理以下评论-)

    是

        3
  •  8
  •   David Sopko    7 年前

    否,在列上创建外键不会自动在该列上创建索引。在以下每种情况下,未能索引外键列将导致表扫描:

    • 每次从引用(父)表中删除记录时。
    • 每次更新FK列时。

    在此示例模式中:

    CREATE TABLE MasterOrder (
       MasterOrderID INT PRIMARY KEY)
    
    CREATE TABLE OrderDetail(
       OrderDetailID INT,
       MasterOrderID INT  FOREIGN KEY REFERENCES MasterOrder(MasterOrderID)
    )
    

       SELECT ..
       FROM 
          MasterOrder ord
          LEFT JOIN OrderDetail det
           ON det.MasterOrderID = ord.MasterOrderID
       WHERE ord.OrderMasterID = @OrderMasterID
    

    一般来说,不为外键编制索引比规则更为例外。

    不索引外键的情况是永远不会使用外键。这将使服务器的维护开销变得不必要。类型表有时可能属于此类,例如:

    CREATE TABLE CarType (
       CarTypeID INT PRIMARY KEY,
       CarTypeName VARCHAR(25)
    )
    
    INSERT CarType .. VALUES(1,'SEDAN')
    INSERT CarType .. VALUES(2,'COUP')
    INSERT CarType .. VALUES(3,'CONVERTABLE')
    
    CREATE TABLE CarInventory (
       CarInventoryID INT,
       CarTypeID INT  FOREIGN KEY REFERENCES CarType(CarTypeID)
    )