我有一个由以下列组成的表:
表名: 用户
列: {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
提前致谢。
答案 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'