跨多个表的 SQL 唯一性

GWe*_*Wed 4 mysql innodb database-design unique-constraint

我有两个 SQL 表:用户和客户。

users 表中的每一行在clients 表中都有一组clients,由users 表id字段和clients 表user_id字段链接。

用户表有一个username唯一的字段。

客户表有一个user_id字段 ANDclientname字段,它们一起是唯一的(即clientnames可以存在多次,但必须有不同的user_ids

我的问题是:如何添加强制username用户表中的clientname字段和客户表中的字段之间的唯一性的规则?甚至有可能吗?

即 nousername可以与 a 相同clientname,noclientname可以与 a 相同username

Fru*_*ner 8

你可以有第三个表来存储两者。像这样的东西:

unique_ids
----------
  标识符(唯一)
  used_where(使用标识符的表的名称/ID)

用户
-----
  用户名(FK 到 unique_ids.identifier)

客户
-------
  客户端名称(FK 到 unique_ids.identifier)

这样,两个表共享一个公共表,其中包含需要唯一的值,并且可以在该共享表中轻松实施唯一性约束。您还需要一个简单的插入触发器(在两个表上),该触发器将检查该used_where字段以确保其他表尚未使用该标识符(因为如果我了解您的要求,则username必须是唯一的,usersclientname不需要在clients) 中是独一无二的。

如果您不想引入新结构并修改现有结构,您可以尝试使用 on-insert 触发器 onclientsusers检查以确保新记录不包含现有用户名/客户名。

  • 向您的 unique_ids 表添加一个类型列。将其传播到两个子表。将其包含在 FK 约束中。让 CHECK 约束验证用户表中的 type=1 和客户端表中的 type=2。 (2认同)