【问题标题】:SQL Server String column as a unique keySQL Server 字符串列作为唯一键
【发布时间】:2009-11-20 17:51:32
【问题描述】:

我正在使用 SQL 服务器表来保存带有 URL 的相关信息。所以有一个 Column 作为“URL”,它的类型是 VARCHAR 。在应用程序中,我们必须使用此 URL 作为查询信息的唯一键(我们使用类似 SELECT * FROM Table WHERE URL = "www.google.com\ig")

使用 URL 作为唯一键有什么缺点或已知缺点吗?

【问题讨论】:

    标签: sql-server database


    【解决方案1】:

    通常最好使用数值而不是字符串作为表键。在此处查看有关此主题的讨论:Database Primary Key C# mapping - String or int

    至于使用 URL,只要您有一些基本规则来避免插入相同(等效)的 URL 两次,它就不会给您带来任何问题。也就是说,数据库会将 "www.google.com""http://www.google.com" 解释为不同的字符串,所以你应该有一个规则,比如“URLs will never have协议标识符”或“URL 永远不会以斜杠结尾”,或任何对您的设计有意义的内容。

    【讨论】:

      【解决方案2】:

      正如其他人所说 - 我绝对不会使用像 URL 这样的长字符串作为 SQL Server 表上的主键/集群键 - 但当然,您应该随意对该列设置唯一约束,以确保你没有得到任何重复!

      您可以执行 UNIQUE CONSTRAINT 或 UNIQUE INDEX - 最终结果几乎相同(唯一约束也将在幕后使用索引)。 UNIQUE INDEX 的优点是您可以在单独的表中将其作为外键引用,因此我几乎总是使用这种方法:

      CREATE UNIQUE NONCLUSTERED INDEX UIX_YourTable_URL ON dbo.YourTable(urlField) 
      

      如果您尝试插入表中已经存在的值,则该插入语句将被拒绝并出现 SQL 错误,并且不会发生任何错误。

      【讨论】:

        【解决方案3】:

        我仍然会在表上创建一个聚集列键,例如一个自动编号,然后在 URL 列上创建一个唯一索引。

        但是我不明白为什么一个 URL 不是唯一的并且所有的都应该按原样工作。

        【讨论】:

          【解决方案4】:

          如果需要分页,您可能会受益于数字主键。但是您将来仍然可以添加数字索引器。所以把 URL 做成 PK 是没有障碍的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多