Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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_Database - Fatal编程技术网

Mysql 包含完全唯一行的表的主键?

Mysql 包含完全唯一行的表的主键?,mysql,database,Mysql,Database,直接进入这个。我有一张桌子,有点“喜欢”的特点。此表自然包含以下内容: Name | Type | Attributes | (Comment) Post ID | int | index | ID of the post which was "Liked" Topic ID | int | index | ID of the topic which contains the "Liked" post Member ID | int

直接进入这个。我有一张桌子,有点“喜欢”的特点。此表自然包含以下内容:

Name      | Type   | Attributes  | (Comment)
Post ID   | int    | index       | ID of the post which was "Liked"
Topic ID  | int    | index       | ID of the topic which contains the "Liked" post
Member ID | int    | index       | ID of the member who "Liked" the post
Date      | bigint | index       | Date/time of "Like"
正如您所看到的,没有主键。这似乎很自然。唯一需要执行的功能是插入(表示“喜欢”)、删除(表示“不喜欢”)以及由提供这些功能的帖子或会员按最近的顺序搜索喜欢的内容

每个条目显然都非常“独特”——因为每个帖子每人只需要一个类似条目。似乎完全不需要一个唯一的主索引,好像发生了重复(不知何故),我想将它们全部删除,而不仅仅是一个具有特定ID的索引。与插入相同,没有人可以两次喜欢相同的东西。这些“like”只能使用其他表中的索引来选择

然而,phpMyAdmin现在禁止我进行任何手动编辑、复制或删除。这也很好,但促使我进一步查找没有主键的逻辑。当我找到stackoverflow的答案时,普遍的看法是不需要主键是“非常罕见的”


所以,要么我发现了一个非常罕见的时刻,要么根本就不罕见。我的情况似乎非常简单和常见,因此应该有一个更明确的答案。通过这种方式,一切看起来都很自然,我永远不需要实际使用主键。因此,我认为没有一个更简单。我忽略了MySQL有什么真正神秘的(有些神奇的)方式吗?或者至少在我找到它们的用途之前,我可以省略一个无用的自动递增主ID键(它可能在当前使用的任何ID之前达到它的极限)(永远不会)?

您说过,Post ID和成员ID定义了列的唯一性(该主题ID是次要的,仅为方便而包含)

那么,为什么不在
(Post ID,Member ID)
上设置主键呢?如果您已经对它们设置了
UNIQUE
ness约束,那么这并不是一个很大的飞跃

CREATE TABLE `Likes` (
   `PostID`   INT UNSIGNED NOT NULL,
   `TopicID`  INT UNSIGNED NOT NULL,
   `MemberID` INT UNSIGNED NOT NULL,
   `Date`     DATETIME     NOT NULL,

   PRIMARY KEY (`PostID`, `MemberID`),
   FOREIGN KEY (`PostID`)   REFERENCES `Posts`   (`ID`) ON DELETE CASCADE,
   FOREIGN KEY (`MemberID`) REFERENCES `Members` (`ID`) ON DELETE CASCADE
) Engine=InnoDB;
(我对
TopicID
了解不够,无法为其提供关键约束,但您可能希望添加一些约束。)

当然,添加任意的自动递增字段是毫无意义的,但这并不意味着您不能拥有有意义的主键


顺便说一下,我会考虑删除<代码> TopicID <代码>字段;如果外键设置正确,那么在没有外键的情况下进行posttopic查找应该很简单,在这种情况下,您复制了数据并违反了关系模型

真是个问题!。。?我在预览中看到了“为什么帖子ID不是主要的”。。。答案很简单,因为多个用户可以喜欢同一篇文章;P不管怎样,正如你们可能已经看到的,我现在已经把它转换成了一个答案。我想知道怎么做。。。我不知道MySQL有元组,也不知道它如何在语法上使用元组(我自己就是C++/PHP)。而且没有唯一的s,因为每个值都可以再次使用。只有每一行本身是唯一的。@Deji:所有三个ID的组合值都是唯一的,不是吗?当您为表选择主键时,与任何其他键一样,您可以指定一个或多个列作为主键的一部分。实际上,只有帖子ID和会员ID。主题ID是一个帮助器,可以进行一次查询以获取当前页面的所有相关喜好。嘿,这非常简单,与我原来的方法只有一点不同,谢谢!(~3分钟后接受-stackoverflow低估了它的用户)@Deji“我不知道MySQL有元组”:它有元组,但这不是元组之一。这是一系列列名,这就是键。“没有唯一性,因为每一个值都可以再次使用。”:你错误地描述了。UNIQUE/PK适用于只能出现一次的子代码,其中不包含可以显示的较小子代码。