Mysql 无PK表
我有一个项目表,在确定的时间段内有一个机架,正好是一周,我需要制作请求周的排名表,例如:Mysql 无PK表,mysql,sql,database,model,Mysql,Sql,Database,Model,我有一个项目表,在确定的时间段内有一个机架,正好是一周,我需要制作请求周的排名表,例如: Items ----- id name 以及: 如果我这样做: SELECT r.rank, i.* FROM Item_in_rank AS r INNER JOIN Items AS i ON r.item_id = i.id WHERE week = 4 AND year = 1986 ORDER BY r.rank ASC 我得到
Items
-----
id
name
以及:
如果我这样做:
SELECT
r.rank,
i.*
FROM
Item_in_rank AS r
INNER JOIN
Items AS i
ON r.item_id = i.id
WHERE
week = 4 AND year = 1986
ORDER BY
r.rank ASC
我得到一个排名:
rank id name
1- 4 jhon
2- 76 jorge
3- 21 myriam
4- 92 bety
很可能,我可以在几周/几年内有一个项目,只要我有一个清单。我不需要一个pk在这个模型中,但是,它是正确的吗
如果我定义为pk(周,年),我不能有:
week year item rank
1 1980 41 1
1 1980 32 2
etc..
如果我定义为pk(周、年、项),我需要为(周、年)创建一个索引,pk将是无用的
这是正确的吗?还是我错了?你总是需要PK,尤其是当你认为你不需要的时候。PK的目的是确保您可以始终唯一地标识记录。这对于数据库正确执行不是可选的(当您没有PK时,尝试删除DUP,如果您没有PK,则有100%的可能性会有DUP),并不意味着您可能不需要其他索引。在许多数据库中(我不确定mysql),PK更像是表上的约束。换句话说,这个表就是PK。数据按主键顺序存储,但不会因为主键而显著增大 尝试添加PK并查看数据存储大小是否增加。添加辅助索引(可能首先需要PK)以帮助您的查询正确执行 不要太担心创建一个无用的PK。自己测试一下,看看它是否值得创建 如果我定义为pk(周、年、项目)i 将需要为创建索引 (周,年),pk将是 没用 向索引中添加列会使索引变大(这是一件坏事),但不会降低它的有用性。MySQL可以使用
(col1,col2)
上的索引来搜索col1
。因此,请务必将主键更改为(周、年、项目)
举一个不起作用的索引的例子:如果主键是(col1,col2)
,那么MySQL不能使用它来搜索col2
。这就像使用按lastname,firstname
排序的电话簿来搜索名字一样
这是正确的吗?还是我错了
你错了!:) 正确的是(周、年、项目)作为PK,是一个真理唯一的鉴定者。
week year item rank
1 1980 41 1
1 1980 32 2
etc..