2009-11-01 131 views
1

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

  • roomtypes [ID(PK),姓名,maxAdults ...]
  • 功能(例如:上网,卫星电视)

既可ID和名称字段在MySQL MYISAM中的同一个表中是唯一的?

如果上述是更多钞票,我想改变表的:

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

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

回答

8

当然,你可以让他们其中之一主要和一个独特。或者都是唯一的。或者一个主要和四个独特的,如果你喜欢

0

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

在SQL中,这是与实现:

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

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

5

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

我想改变的特性表特性[ID(PK),姓名,roomtypeNAME],因为它帮助我不要做多余的查询中呈现的功能,因为前端用户不能与处理标识。

有两个问题:

  1. ROOM_TYPE_NAME一个独特的约束是行不通的 - 你就会有一个给定的房间类型的多个实例,以及独特的约束旨在制止。
  2. 由于不使用外键ROOM_TYPES表,你就有可能得到的值,如“双”,“双”,“双”

我建议您与原来的设计为您的数据的缘故坚持;您的应用程序就是将房间类型转换为其各自的ROOM_TYPE记录,同时UI使其更易于表现。

0

是的,你可以。

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

+0

主键确实可以有空值。任何INDEX都允许NULL为了防止出现NULL,你必须在列上明确地设置NOT NULL。 PRIMARY和UNIQUE键唯一的区别是PRIMARY是优化器尽可能使用的第一个键。 – 2009-11-02 18:25:53

+0

至少在5.1版本,它不能, “主键是所有键列必须被定义为NOT NULL唯一索引。如果不明确声明为NOT NULL,MySQL的声明他们这么含蓄(默)。表格只能有一个主键。“ http://dev.mysql.com/doc/refman/5.1/en/create-table.html – Anjisan 2009-11-03 01:59:49

0

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

1 roomType可能有很多功能

1功能可以被分配给许多roomTypes

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

如果是的解决方案,我看到的是不断变化的表结构 roomTypes [ID,...,featuresIDs] 特征[ID(PK),姓名,roomtypeIDs]多用逗号分隔roomTypesIDs?

0

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

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

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

相关问题