【问题标题】:SQL complex primary keySQL 复杂主键
【发布时间】:2016-02-17 16:15:14
【问题描述】:

我想从两个不同的列和 IDENTITY 创建一个复杂的主键。例如:

我的桌子:

create table Location (
     locationID int primary key,
     lat int not null,
     lng int not null,
)

lat = 43
lng = 567

我希望主键值如下所示:

locationID = 43.567-1

如果已经存在以“43.567”开头的 locationID,则将添加“-1”。

有可能吗?

【问题讨论】:

  • 我认为您应该重新考虑您的数据库架构。如果您的 lat/long 确实是复合主键,为什么还要使用 locationID?为什么要拥有多个具有相同纬度/经度的位置 ID?这没有任何意义。 lat/long 不应该是 intlocationID 如果你也强制填充它,它就不再是 identity
  • 感谢您的参考,但我在这里写的只是一个例子。这个想法是为了以后使用组合键的方式,以便以不同的方式理解和使用它。
  • 在主键/候选键中编码信息是个坏主意。搜索回复smart/intelligent keys
  • 什么意思,你能做到吗?是的,你可以让价值观是这样的。 (虽然这是个坏主意。)你的意思不是这样吗?
  • 坏主意。要么使用复合主键,要么严格自动生成。记住主键和索引是有区别的

标签: sql database-design primary-key composite-primary-key


【解决方案1】:

未经本人测试,但可以使用触发器

http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html

但是,如果您尝试在没有主键值的情况下发出查询,则可能会遇到问题

【讨论】:

  • 提供的链接是mysql的,其他大部分sql提供者也支持触发器
【解决方案2】:

您也可以只使用复合键,在这里您可以使用 lat 和 lng。复合键的美妙之处在于构成列的值中只有一个必须是唯一的。

【讨论】:

    【解决方案3】:

    您可以创建一个复合主键,但它仍然必须是唯一的。您尝试做的事情毫无意义。您正试图通过向重复项添加任意值来强制非唯一值是唯一的,以便使其唯一。

    解决此问题的正确方法是不使用重复的 lat/lng 组合,或者仅使用您的 LocationID 作为主键。

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 2019-04-24
      • 2018-06-26
      • 2014-05-25
      • 2014-08-24
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多