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

How do I set 2 columns so each entry is unique against both columns?

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

这样做的目的是用户将使用 Key1 进行所有操作。然后他们发现Key1变成了public。所以他们切换到 Key2,然后在 15 分钟后,更改 Key1 的值。现在旧的 Key1 值没有用了。

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

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

有没有办法在 Sql 服务器中强制执行此操作。或者我是否需要在插入或更新之前使用 select 自己执行此操作?

-------------------------------------------------------------------------------------------
| 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。

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

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|
----------------------------------------------------------