Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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 无PK表_Mysql_Sql_Database_Model - Fatal编程技术网

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..