Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我应该将哪个列作为主键?_Mysql_Sql_Database Schema_Rdbms - Fatal编程技术网

Mysql 我应该将哪个列作为主键?

Mysql 我应该将哪个列作为主键?,mysql,sql,database-schema,rdbms,Mysql,Sql,Database Schema,Rdbms,我在做一张桌子 移动模型信息 +-------------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+-----------------+------+-----+---------+----------------+ | ID

我在做一张桌子

移动模型信息

+-------------+-----------------+------+-----+---------+----------------+
| Field       | Type            | Null | Key | Default | Extra          |
+-------------+-----------------+------+-----+---------+----------------+
| ID          | int(5) unsigned | NO   | PRI | NULL    | auto_increment |
| linktospecs | varchar(255)    | YES  |     | NULL    |                |
| name        | varchar(30)     | NO   | UNI | NULL    |                |
| company     | varchar(20)     | NO   |     | NULL    |                |
+-------------+-----------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
在此表中,来自任何手机制造商的每一部手机只会出现一次,同时还会显示其他信息,如制造商的名称和指向其规格的官方链接。这就是我现在能想到的

我想要的是,由于
name
列本身是唯一的(两行相同的移动型号会很愚蠢),我希望能够使用它进行索引,因为在我的应用程序中,当用户搜索移动名称时,我会使用
name
列从该表中检索所有其他列

但在许多例子中,我看到人们使用一个额外的简单ID列,自动递增,以保持它作为一个简单的主键。 因此,我的问题是,我是否需要保留
ID
列,还是唯一的
name
列足以使用此表? 我不熟悉数据库和SQL

主键意味着它将是一个聚集索引-搜索
name
列比搜索
id
列要多,因此搜索应该比非聚集索引每分钟改进一次。-


我更喜欢ID,因为名字可能会像诺基亚500和HTC 500一样匹配。您不能在模型名称中添加公司名称。在这种情况下,您可能会得到多个。在这个场景中,最好使用“ID”作为键


如果您不想使用ID作为附加列,那么可以将company和name组合作为主键。

将ID列作为主键始终是一个好主意,因为它永远不会更改。如果您需要更改手机的名称,并且名称是主键,则之前对该手机的任何引用都将立即停止工作,因为主键值已不存在。另一方面,如果每个引用都有一个唯一的ID,则可以在不影响ID的情况下更改名称,并且所有以前的引用都将保持有效


也有可能两个不同的公司会推出同名手机,在这种情况下,如果名称是您的主键,那么您只能在其中一个手机上存储信息。

我认为使用
ID
列会更好,就好像在不久的将来,如果您想添加一些功能,其中包括外键(出现在其他表中的表的主键)概念,那么使用
ID
可能只是您的任务和您在各个方面的努力
(如果您需要更改手机的名称,并且名称是主键,那么之前对该手机的任何引用都将立即停止工作,因为主键值不再存在)

好吧,我会保留ID列,但这是一个长期的争论。试着用谷歌搜索
代理vs主键
,找到你喜欢的哲学……我从互联网上关于SQL的教程中了解到,
唯一
意味着一个列将具有唯一的值,所以我应该在逻辑上只使用
名称
作为主键。但是我对SQL和数据库还不熟悉,所以我需要一个外部意见才能让我的东西生效。使用ID是个好主意。然后,您可以更新任何其他字段,而无需断开与其他表的链接。所有内容都可以按ID访问记录。即使您决定使用
ID
列,如果您只想在该列中使用唯一值,请在
name
上应用
UNIQUE
索引。记住,仅仅因为有主键(以任何形式),您也应该强制执行任何辅助键。这可以让你的数据库更干净。@Damien_,不相信我在创建表时这么做的人。下面是此表的
show create table
转储:这就是您所说的,对吗?编辑-实际上这就是我创建它的方式。与dump不同:您是说使用
(名称,公司)
的复合键比使用
ID
更好?此表的记录不会超过1000条。我的意思是
主键(名称,公司)
哦,是的,我没有意识到手机型号名称的更改,这不是很可能,但可能会发生,我不想破坏我的数据库(如果可能的话)