我可以在同一个表中有2个唯一列吗?

时间:2009-11-01 12:44:30

标签: sql mysql database

我有两张桌子:

  • roomtypes [ID(PK),姓名,maxAdults ...]
  • 功能(例如:房间内的互联网,卫星电视)

在mysql MYISAM的同一个表中,id和name字段都可以是唯一的吗?

如果以上是可行的,我正在考虑将表格更改为:

  • features [id(PK),name,roomtypeID] ==>特征[ID(PK),姓名,roomtypeNAME]

...因为它帮助我不要在演示文稿中对功能进行额外的查询,因为前端用户无法处理ID。

6 个答案:

答案 0 :(得分:8)

当然,你可以让其中一个为PRIMARY而另一个为UNIQUE。或者两者都是UNIQUE。或者一个PRIMARY和四个UNIQUE,如果你喜欢

答案 1 :(得分:5)

是的,您可以为主键以外的列定义UNIQUE约束,以确保数据在行之间是唯一的。这意味着该列中的值只能 一次 - 任何添加重复项的尝试都将导致唯一的约束违规错误。

  

我正在考虑将FEATURES表更改为功能[id(PK),name,roomtypeNAME],因为它帮助我不要在演示中对功能进行额外查询,因为前端用户无法处理ID。 / p>

有两个问题:

  1. ROOM_TYPE_NAME上的唯一约束不起作用 - 您将拥有给定房间类型的多个实例,并且设计了一个唯一约束来阻止它。
  2. 由于没有使用ROOM_TYPES表的外键,您可能会冒“Double”,“double”,“dOUBle”这样的值。
  3. 为了您的数据,我建议坚持使用您的原始设计;您的应用程序将房间类型转换为各自的ROOM_TYPE记录,同时用户界面使其显示。

答案 2 :(得分:0)

我希望如此,否则MySQL不符合SQL标准。您只能拥有一个主键,但可以将其他列标记为唯一。

在SQL中,这是通过以下方式实现的:

create table tbl (
    colpk char(10) primary key,
    coluniq char(10) unique,
    colother char(10)
);

还有其他方法(特别是使用多部分键),但这是一个简单的解决方案。

答案 3 :(得分:0)

是的,你可以。

另请注意,MySQL允许唯一列中的NULL值,而作为主键的列不能具有NULL值。

答案 4 :(得分:0)

再次感谢您提供非常有用的答案。

1 roomType可能有很多功能

可以为许多房型分配1个功能

那么我有什么样的关系? M:N?

如果是,我看到的解决方案是将表结构更改为 roomTypes [ID,...,featuresIDs] feature [id(PK),name,roomtypeIDs]用逗号分隔的多个roomTypesID?

答案 5 :(得分:0)

  

1 RoomType可能有许多功能
  1功能可以分配给许多RoomTypes
  那么我有什么样的关系? M:N?

你有一个多对多的关系,必须用额外的表来表示 该关系表将有两个字段:RoomTypes的PK和特征的PK 关系表的PK将由这两个字段组成。 如果这是有用的,您可以添加额外的字段,如数量。

我想鼓励您阅读有关数据库规范化的内容,这是为关系数据库创建正确设计的过程。您可以谷歌,或最终查看here(这里有很多书籍/网页)