sql - 主键还是唯一索引?

标签 sql database database-design

在工作中,我们有一个带有唯一索引而不是主键的大型数据库,并且一切正常。

我正在为一个新项目设计新的数据库,但我遇到了一个难题:

在 DB 理论中,主键是基本元素,这没关系,但在 REAL 项目中,两者的优点和缺点是什么?

你在项目中使用什么?

编辑: ...那么 MS SQL 服务器上的主键和复制呢?

最佳答案

什么是唯一索引?

列上的唯一索引是该列上的索引,它还强制执行约束,即在该列中的两个不同行中不能有两个相等的值。示例:

CREATE TABLE table1 (foo int, bar int);
CREATE UNIQUE INDEX ux_table1_foo ON table1(foo);  -- Create unique index on foo.

INSERT INTO table1 (foo, bar) VALUES (1, 2); -- OK
INSERT INTO table1 (foo, bar) VALUES (2, 2); -- OK
INSERT INTO table1 (foo, bar) VALUES (3, 1); -- OK
INSERT INTO table1 (foo, bar) VALUES (1, 4); -- Fails!

Duplicate entry '1' for key 'ux_table1_foo'

最后一次插入失败,因为它在第二次尝试将值 1 插入该列时违反了列 foo 上的唯一索引。

在 MySQL 中,唯一约束允许多个 NULL。

可以在多个列上创建唯一索引。

主键与唯一索引

相同的东西:

  • 主键意味着唯一索引。

不同之处:

  • 主键也意味着 NOT NULL,但唯一索引可以为空。
  • 主键只能有一个,唯一索引可以有多个。
  • 如果没有定义聚簇索引,则主键将是聚簇索引。

关于sql - 主键还是唯一索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/487314/

相关文章:

mysql - 创建查询以显示长文本字段中特定结果的计数

mysql - 有更好的方法吗? MySQL

mysql - 我可以用 int、tinyint、mediumint 等保存什么

mysql - 为什么这个 SQL 语句不起作用

mysql - 在旧版本的mysql中,我们可以使用WITH语句的替代方案是什么?

mysql - 在 SQL 中将单个列(姓名)拆分为两列(名字、姓氏)

database - cassandra - 如何执行表查询?

mysql - 不必要的标准化

mysql - 将两个表合并到一个新表中

mysql - 数据库设计按列表和公司对联系人进行分组