如何设置2列,以便每个条目对这两列都是唯一的?

时间:2018-09-16 14:29:14

标签: sql-server unique-key

我有一条记录,其中包含2个许可证“密钥”(实际上是GUID)。当请求到达我们的服务时,它在请求中包含一个密钥(GUID)。然后,我执行查询以查找在Key1或Key2列中具有该值的记录。

这样做的目的是用户将对所有内容使用Key1。然后他们发现Key1已公开。因此,他们切换到Key2,然后在15分钟后更改Key1的值。现在,旧的Key1值已无用。

通过使用2个键,它可以在不停机的情况下进行切换。

我需要任何键值都是唯一的。并非任何一对值都是唯一的。并不是说Key1中的键1的值在所有行中都是唯一的,而是新值在所有row.Key1和rows.Key2中都是唯一的。

是否有一种方法可以在Sql Server中强制执行此操作。还是在插入或更新之前需要自己进行选择?

-------------------------------------------------------------------------------------------
| LicenseId | ApiKey1                              | APiKey2                              |
| 1         | af53d192-7fa3-4be0-b3d4-7efe17a397b5 | 1a87cc4a-1941-4af7-aeaa-bf9690f47eef |
| 2         | 5bbc2d06-ed6f-4444-aa22-73820dd6f3f6 | c2bdd9d9-fd47-4727-83f8-02ed0e7537e1 |
| 3         | 8acfa8b4-aa4b-41a7-9d3d-b6ba1eac838e | 30c18f2d-5d89-4e5d-8e8e-2d2b647d6ab6 |
-------------------------------------------------------------------------------------------

我需要确保是否要创建记录LicenseId = 4,如果它具有ApiKey2 ='af53d192-7fa3-4be0-b3d4-7efe17a397b5',则插入操作将失败,因为Guid是ApiKey1 for LicenseId = 1

1 个答案:

答案 0 :(得分:0)

在数据库中强制执行此操作的最自然的方法是将所有键放在单个列中。例如

create table ApiKeys
(
  LicenceId int, 
  KeyId int check (KeyId in (0,1)),
  constraint pk_ApiKeys primary key (LicenceId,KeyId),
  KeyGuid uniqueidentifier unique
)

可以说两个键都在同一行上违反了1NF,当然您对两列唯一性的渴望强烈建议它们都属于一个域。

因此,您不必将ApiKey1和ApiKey2存储在同一行中,而是将它们存储在两行中。

所以不是


---------------
| LicenseId | ApiKey1                              | APiKey2                              |
| 1         | af53d192-7fa3-4be0-b3d4-7efe17a397b5 | 1a87cc4a-1941-4af7-aeaa-bf9690f47eef |
| 2         | 5bbc2d06-ed6f-4444-aa22-73820dd6f3f6 | c2bdd9d9-fd47-4727-83f8-02ed0e7537e1 |
| 3         | 8acfa8b4-aa4b-41a7-9d3d-b6ba1eac838e | 30c18f2d-5d89-4e5d-8e8e-2d2b647d6ab6 |
-------------------------------------------------------------------------------------------

您将拥有:

----------------------------------------------------------
| LicenseId | KeyId | ApiKey                              |
| 1         | 0     | af53d192-7fa3-4be0-b3d4-7efe17a397b5|
| 1         | 1     | 1a87cc4a-1941-4af7-aeaa-bf9690f47ee4| 
| 2         | 0     | 5bbc2d06-ed6f-4444-aa22-73820dd6f3f6|
| 2         | 1     | c2bdd9d9-fd47-4727-83f8-02ed0e7537e1|
| 3         | 0     | 8acfa8b4-aa4b-41a7-9d3d-b6ba1eac838e|
| 3         | 1     | 30c18f2d-5d89-4e5d-8e8e-2d2b647d6ab6|
----------------------------------------------------------