【问题标题】:How to make a column have a unique value accross other columns如何使一列在其他列中具有唯一值
【发布时间】:2020-01-07 20:01:50
【问题描述】:

假设我有一个 User 表,其中包含一个具有唯一约束的 username 列。现在我需要添加一个alias 列,该列也必须是唯一的,但附加的要求是没有两个用户可以拥有相同的usernamealias (user1.username <> user2.alias)。我将如何使用 MySQL 进行此操作?

我知道复合唯一索引,但它们会检查 usernamealias 的组合是否重复,而不是一个用户的 username 的组合等于新用户的 alias

【问题讨论】:

  • 我可能会考虑触发器。
  • user1.username可以和user1.alias一样吗?
  • @mypetlion 不,这也是不允许的

标签: mysql sql ddl


【解决方案1】:

关系方式是创建另一个表user_names,每个用户可以在该表中拥有一行或多行。

CREATE TABLE user_name (
  user_id INT NOT NULL,
  user_name VARCHAR(16) NOT NULL,
  PRIMARY KEY (user_id, user_name),
  UNIQUE KEY (user_name)
);

UNIQUE KEY 强制所有用户的唯一性。

复合 PRIMARY KEY 可以高效地从 users 表连接到 user_names 的聚集索引。

【讨论】:

  • 我已经对此进行了一些测试,它确实有效,但是没有其他方法可以不涉及从 User 表中获取 usernamealias 吗?
  • 不使用约束,不。您可以使用触发器或应用程序代码来检查重复项,但这会引入竞争条件。
【解决方案2】:

我会在那张桌子上找一个触发器。你在这里找到的细节 --> https://www.siteground.com/kb/mysql-triggers-use/.

基本上,您将在每次插入之前执行检查。不完全是性能的朋友,但这会给你你需要的东西。

CREATE TRIGGER aliascheck BEFORE INSERT ON User FOR EACH ROW IF NEW.alias in (select username from User) THEN SIGNAL SQLSTATE '45000' set message_text='Alias already exists!'; END IF;

...或者类似的东西。我有 TSQL 背景:)

【讨论】:

  • 不幸的是,这会在检查时在user 表中的每一行上创建一个锁。如果插入后事务没有及时提交,您的应用程序将严重瓶颈。
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
相关资源
最近更新 更多