Mysql 没有主键的数据库表

Mysql 没有主键的数据库表,mysql,database,Mysql,Database,我有一张用于留言板的桌子(见下文)。我知道最佳实践要求创建一个主键,但我看不出有任何理由创建主键。我将主要搜索(UID,GRP\u ID)并在此基础上创建索引。删除将基于上次\u时间tp。在这种情况下,是否应该有一个PK CREATE TABLE CP.CHAT (UID BIGINT NOT NULL, GRP_ID BIGINT NOT NULL, CHAT VARCHAR(200) NOT NULL, LAST_TIMESTP TIMESTAMP); 主键是不需要的,您的表可以正常工作

我有一张用于留言板的桌子(见下文)。我知道最佳实践要求创建一个
主键
,但我看不出有任何理由创建主键。我将主要搜索(
UID,GRP\u ID
)并在此基础上创建索引。删除将基于
上次\u时间tp
。在这种情况下,是否应该有一个
PK

CREATE TABLE CP.CHAT
(UID BIGINT NOT NULL, GRP_ID BIGINT NOT NULL, CHAT VARCHAR(200) NOT NULL, LAST_TIMESTP TIMESTAMP);

主键是不需要的,您的表可以正常工作

以下是我几乎总是使用主键的一些原因

  • 它们允许您唯一地将一行作为目标。如果有多行具有完全相同的数据,那么将其删除可能会很繁琐

  • 它们为表提供隐式排序。如果要对数据库进行故障排除,则键的顺序会告诉您它们的创建顺序


  • 最终,就存储空间而言,PK占用的空间不会成为数据库的巨大开销。拥有它不会有什么坏处,但拥有它会有所帮助。

    我认为没有必要告诉您什么是主键以及主键的用途。看来你已经知道了,并且很好地理解了它的结构

    问题是,如果您没有任何其他依赖于此表的表,那么您的表设置就足够了。因为您已经有了UID列,所以我建议将其作为PK,因为它在存储方面不会花费您太多,但也可以帮助您对表进行排序(通过自动递增整数),并在将来作为删除和更新操作的选择


    仍然无法理解如何通过Last_timestp值删除记录,尽管…

    只是为了学究,它们并不意味着排序,除非它们是自动递增的(或处理方式类似);而且我也不相信自动增量正式保证了序列(但在我的经验中这是非常可靠的)。我有一种感觉,我不需要pk,只是需要确定。如果不太可能,您可能会有多个具有相同LAST_TIMESTP值的行;正如勒巴顿在回答中所说,一个简单的自动递增id字段所占用的空间量是可以忽略的。另外,
    BIGINT
    对于用户或组id来说可能是极端的过度使用;对于一个自动递增的主键来说,这甚至可能是杀伤力过大
    INT
    是大小的一半;您可以将ID、UID和GRP_ID设置为INT,并且该表将比您在上面定义的表小。我假设UID表示创建消息的用户,因此由于明显的原因它无法工作。Oww。。。我猜不出这是Users表的外键,抱歉:)我可以发誓问题最初指定了这一点,但我必须从提问者提供的上下文中假设它。删除将是这样的。。。从聊天中删除上次\u timestp>1周前我发现的内容。谢谢你在这件事上反驳我。