【问题标题】:What is the difference between UNIQUE, UNIQUE KEY and CONSTRAINT 'name' UNIQUE?UNIQUE、UNIQUE KEY 和 CONSTRAINT 'name' UNIQUE 有什么区别?
【发布时间】:2012-03-01 09:01:26
【问题描述】:

我有一个基本的users 表,我想在 MySQL 中创建。

我不希望数据库中出现重复的电子邮件或重复的用户名。

  • 在创建表时防止这种情况的最佳方法是什么?
  • 以下两者有什么区别:

1. UNIQUE (username), UNIQUE (email),

2. UNIQUE KEY (username), UNIQUE KEY (email),

3. CONSTRAINT ucons_login UNIQUE (username, email),

我认为其中一些是同义词,但我一直在网上阅读相互矛盾的信息并寻求确认。

希望有人能提供帮助。

SQL:

CREATE TABLE users (
  user_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  username VARCHAR(30) NOT NULL,
  pass CHAR(40) NOT NULL,
  first_name VARCHAR(20) NOT NULL,
  last_name VARCHAR(40) NOT NULL,
  email VARCHAR(60) NOT NULL,
  registration_date DATETIME NOT NULL,
  user_level TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
  active CHAR(32),
  PRIMARY KEY (user_id),
  UNIQUE (username),
  UNIQUE (email),
  INDEX login (email, pass),
  INDEX full_name (last_name, first_name)
) ENGINE=INNODB;

【问题讨论】:

  • ps:email,pass 的索引可能只会让事情变慢。电子邮件的唯一约束也可以用作普通索引。电子邮件上的选择最多将返回 1 行,因此无需在传递时也索引。

标签: mysql database-design unique create-table unique-constraint


【解决方案1】:

1 和 2 是相同的 - 都创建两个唯一的索引,每个键一个。 #3 只在两个键上创建一个唯一索引,因此用户名和电子邮件的组合不能重复,但例如,只要使用不同的电子邮件,用户名就可以重复。

听起来您可能想要前两个中的任何一个。 UNIQUE 和 UNIQUE KEY 是等价的。

【讨论】:

    【解决方案2】:

    syntax documentation 证明它们都是同义词:

    [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
          [index_name] [index_type] (index_col_name,...)
          [index_option]
    

    此符号中的[] (Wirth's notation) 表示可选元素

    【讨论】:

    • 第三个是跨多个字段的复杂键,而不是两个不同的键。
    • 确实...我在问题中没有注意到这一点。
    • 感谢链接,MySQL 创建表语法现在开始变得更有意义了。
    猜你喜欢
    • 2023-03-16
    • 2012-11-20
    • 2011-04-20
    • 2014-12-07
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多