MySQL Unique Key scenario


MySQL Unique Key scenario

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

表名: 用户

列:{id,fk1,fk2,username}

id:是主要密钥

fk1fk2是来自其他表的外键

有两种情况:

1) fk1+用户名=唯一值

2) fk2+用户名=唯一值

例如:

fk1=国家/地区表中某个国家的id

fk2=状态表中状态的id

在有州的国家(如美国)

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

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

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

因此,如果注册的用户来自有州的国家,我需要为fk2username列创建一个唯一索引。[确保每个状态的唯一性]

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

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

--表名:User_States

列:{id,fk2,username}

fk2+用户名上的唯一索引

--表名:用户

列:{id,fk1,username}

fk1+用户名上的唯一索引

该解决方案可以通过在将数据插入每个表之前过滤用户(用户是否来自状态)来工作。但我只想要一个包含所有用户的表,而不是两个,因为当我想检查例如一封电子邮件是否已经由用户注册(无论是否处于状态)时,我必须执行两个查询(每个表中一个)。或者,如果我想提取一个所有用户名的列表,比如"darklond",无论它们的位置如何,我必须再次执行2个查询。

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

还有一个常见问题:如何检查一个大表上的单个查询是否比两个小表上的两个查询快/慢?

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

提前谢谢。

像这样的工作吗?

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'