【问题标题】:How to create a database table for when in the Primary key column there is repeat values?如何在主键列中有重复值时创建数据库表?
【发布时间】:2017-02-17 19:42:21
【问题描述】:

我正在尝试在不同的日期存储不同的 WEIGHTS 用户上传,当权重被上传时,它们将对应一个主 ID,即“用户名”

所以这就是我的桌子的照片

用户名(PrimaryKEY)---------- 日期 ------------ 权重

乔治------------------2016 年 9 月 24 日---------82

汤姆-----------------------------------24/09/2016------ ---85

哈利-----------------------------------24/09/2016------ --82

乔治------------------25/09/2016---------83

汤姆----------------------------------25/09/2016------- --86

哈利---------------------------------25/09/2016-------- 83

如果有人对我如何以不同的方式执行此操作有任何想法,或者实际上是否可行,请告诉我,谢谢!

【问题讨论】:

  • 将用户名作为 PK 存储在单独的表中,并在此表中将该列称为 FK,在此表中还有一个单独的 id 列,它将是 PK。
  • 通常你会有两张桌子,例如用户和读数,后者引用前者。交替将主键设为用户名和日期。
  • 使用字符串类型列作为主键通常是不好的做法,因为它们必须是唯一的。而是使用自动添加的数字列类型,然后您可以在用户名和日期上添加 2 列唯一索引,例如

标签: android mysql database relational-database


【解决方案1】:

在决定应该选择哪些列作为主键之前,您必须了解数据库表的性质。

这是来自Techopedia主键的定义:

主键是一个特殊的关系数据库表列(或 列组合)指定唯一标识所有表 记录。

主键的主要特征是:

  • 它必须包含每行数据的唯一值。
  • 它不能包含 空值。

主键可以是现有的表列或 由数据库根据 a 专门生成的列 定义的顺序。

在这种情况下,您的表似乎正在存储有关用户的测量信息,该用户被允许在不同的日子进行多次测量(例如,George24/09/2016 上进行了测量,并且然后在25/09/2016 上再发一次),但不是在同一天。

在这种情况下,主键确实应该有两列 -- UsernameDate

不要将主键与唯一键或仅键(索引)混淆。这是SO discussion about the topic

顺便说一句,如果您想进一步允许同一用户在同一天上传多个测量值,那么您有两种解决方案:

  1. 添加一个 surrogate 键列(可能称为 id),它唯一 标识每个测量记录(参见 Wikipedia 讨论)。采用 此代理键作为表的主键。
  2. 使您的Date 列成为Datetime 的类型,而不仅仅是Date。 您仍然必须限制不能超过一个 来自同一用户的任何给定 Datetime 值的测量值(在 MySQL DATETIME 的数据类型支持小数秒(最多 微秒精度))

我个人认为从长远来看使用代理键的方法是最安全的。

【讨论】:

  • PK = UNIQUE NOT NULL。
【解决方案2】:

我会有一个单独的表格供用户使用。

CREATE TABLE `user` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(45) NOT NULL,
  `firstname` VARCHAR(45) NOT NULL,
  `lastname` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `weight` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `weight` VARCHAR(45) NOT NULL,
  `date` DATETIME NOT NULL,
  `username` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `username` FOREIGN KEY `username` (`id`)
    REFERENCES `user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
)

以上表格是按照以下规则创建的

  1. 外键设置为用户表中的 id。如果要将其更改为用户名,请将其更改为。 CONSTRAINT username FOREIGN KEY username(username).

  2. 删除时没有操作,因此即使删除用户,体重记录仍会存在。如果要更改它,请在删除时更改为级联。所以如果一个用户被删除,该用户的体重记录也将被删除。

【讨论】:

  • 感谢您的回复!现在在我的脑海中清除了一切!
猜你喜欢
  • 2023-02-24
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
相关资源
最近更新 更多