如何为主键列中的重复值创建数据库表?

时间:2017-02-17 19:42:21

标签: android mysql database relational-database

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

所以这就是我的照片看起来像

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

乔治------------------------------ 24/09/2016 --------- 82 < / p>

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

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

乔治------------------------------ 25/09/2016 --------- 83 < / p>

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

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

如果有人有任何想法我怎么能以不同的方式做到这一点或实际上如果这实际上有用,请告诉我,谢谢!

2 个答案:

答案 0 :(得分:1)

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

以下是Techopedia主键的定义:

  

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

     

主键的主要功能是:

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

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

在这种情况下,您的表格似乎正在存储有关用户的测量信息,允许其在不同日期进行多次测量(例如George对{24/09/2016进行了测量1}}然后又在25/09/2016)上另一个,但不是在同一天。

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

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

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

  1. 添加唯一的代理键列(可能称为id)  识别每个测量记录(参见维基百科的讨论)。使用  这个代理键是你桌子的主键。
  2. Date列设为Datetime,而不仅仅是Date。  你仍然必须限制不能超过一个  来自同一用户的任何给定Datetime值的测量值(MySQL  DATETIME的数据类型支持小数秒(最多为  微秒精度))
  3. 我个人认为使用代理键的方法从长远来看是最安全的。

答案 1 :(得分:0)

我会为用户提供一个单独的表格。

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. 关于删除不是动作,所以即使删除用户,重量记录仍然存在。如果要更改它,请将删除更改为级联。因此,如果用户被删除,该用户的重量记录也将被删除。