MySQL唯一密钥方案

时间:2014-09-10 13:38:04

标签: php mysql sql sql-server database

我有一个由以下列组成的表:

表名: 用户

列: {id,fk1,fk2,username}

id :是主键

fk1 fk2 是来自其他表的外键

有两种情况:

1)fk1 + username =唯一值

2)fk2 + username =唯一值

例如:

fk1 =国家/地区表格中国家/地区的 ID

fk2 =状态表中状态的 id

在有州的国家/地区(例如美国)

我想要的是用户的用户名在州内唯一。来自不同州的两个用户可以使用相同的用户名,但不能处于相同的状态。

在没有州的国家(例如西班牙)

来自同一国家/地区的两位用户不能拥有相同的用户名。来自不同国家/地区的两位用户可以使用相同的用户名。

因此,如果注册的用户来自某个国家,我需要为列 fk2 用户名创建唯一索引。 [确保每个州的独特性]

如果注册的用户来自没有州的国家/地区,我需要为列 fk1 用户名创建唯一索引。 [确保每个国家的独特性]

到目前为止,我所做的是为来自各州的用户创建一个表,为来自没有州的国家的用户创建一个表。如下所示:

- 表名: User_States

列:{id,fk2,username}

fk2 +用户名的唯一索引

- 表格名称:用户

列:{id,fk1,username}

fk1 +用户名的唯一索引

在将数据插入每个表之前,此解决方案可以通过过滤用户(来自州或不来的用户)来工作。但我想只有一个表与所有用户而不是两个,因为当我想检查一个电子邮件是否已经由用户注册(在状态或不在状态)我必须执行2个查询(每个表一个)。或者,如果我想提取所有用户名列表,例如“darklord”,无论其位置如何,我还是要执行2次查询。

有办法吗?如果是,桌子会怎么样?当用户来自没有州的国家时,我的问题就开始了,因为 fk2 列将为空。我知道唯一索引允许Null值但只有一个Null值。

还有一个一般问题:如何检查大表上的单个查询是否比2个较小表上的2个查询更快/更慢?

PS:我使用的存储引擎是InnoDB

提前致谢。

1 个答案:

答案 0 :(得分:1)

像这样的工作吗?

create table #Something
(
    SomeDataField varchar(10) not null,
    CountryCode char(3) not null,
    StateCode char(2) null,
    CONSTRAINT UniqueCountryState UNIQUE NONCLUSTERED
    (
        SomeDataField, CountryCode, StateCode
    )
)

insert #Something
select 'Value1', 'USA', 'NY' union all
select 'Value1', 'CAN', null union all
select 'Value1', 'MEX', null union all
select 'Value1', 'USA', 'AK'

现在尝试再次插入任何这些值,它会失败,因为组合已经存在。

insert #Something
select 'Value1', 'USA', 'NY'