代码之家  ›  专栏  ›  技术社区  ›  Jesse Hallam

“主键”在SQL Server设计中是强制性的吗?

  •  0
  • Jesse Hallam  · 技术社区  · 16 年前

    遵循下表模型:

    CREATE TABLE [site].[Permissions] (
        [ID]     INT REFERENCES [site].[Accounts]( [ID] ) NOT NULL,
        [Type]   SMALLINT NOT NULL, 
        [Value]  INT NULL
    );
    

    这个站点帐户-&燃气轮机;网站权限是一对多关系,因此由于PK强加的唯一性,“ID”不能成为主键。

    行是使用 WHERE [ID] = ? 因此,添加一个伪标识列并使其成为PK不会以额外的磁盘空间为代价产生任何好处。

    据我所知,目标平台sqlserver(2008)不支持复合PKs。这些加起来就是我的问题: 如果没有使用主键,那么是不是出了什么问题?或者有什么更正确的吗?

    1 回复  |  直到 16 年前
        1
  •  5
  •   Martin Smith    16 年前

    您的理解不正确,SQL Server确实支持复合主键!

    ALTER TABLE  [site].[Permissions] 
    ADD CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (id,[Type])
    

    关于评论中的问题“在整个桌子上放置PK有什么好处?”

    id,[Type] 那么你大概不想看到 id,[类型] 组合框可能出现多次,但值有冲突。

    如果您的表上有一个聚集索引,您可以将其作为主键。如果你在 id 只有列的SQL Server无论如何都会添加uniqueifier以使其唯一,而且您的列太窄了( int , smallint 内景

    WHERE [ID] = ? )如果允许重复的内容被存储和过滤掉,那将是相当浪费的 DISTINCT