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

问题描述 投票:1回答:1

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

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

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

我需要任何键值是唯一的。并不是说任何一对值都是唯一的。并非Key1中的值在Key 1的所有行中都是唯一的。但是,所有rows.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',则插入将失败,因为对于LicenseId = 1,guid是ApiKey1。

sql-server unique-key
1个回答
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|
----------------------------------------------------------
© www.soinside.com 2019 - 2024. All rights reserved.