【问题标题】:How do I to keep the values of a column unique in MySQL?如何在 MySQL 中保持列的值唯一?
【发布时间】:2010-07-26 12:10:39
【问题描述】:

我在 Perl 中进行文件解析并插入到 MySQL 数据库中的表中。例如,我有以下字段:

S.No ,PCID,USERNAME, TIME   INFORMATION.
1     203  JANE      22:08  updation
2     203  JANE      22:09  deletion
3     203  JANE      22:10  insertion

在此表中,我希望 PCID 是唯一的,USERNAME 是唯一的。 S.No 是独一无二的,因为我已将其设置为自动编号并且它是主键。现在我的问题是:

如果我添加 PCIDUSERNAME 作为复合主键,我仍然会在表中找到重复项。没有变化。相同的o / p。应该怎么做才能删除重复项?我应该在 Perl 中编码以在插入之前检查重复项吗?

请指导并提供帮助。提前致谢。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您希望 S.No 保持主键并且 PCID + USERNAME 是唯一的,如此接近 Hammerite 所说的:

    ALTER TABLE MyTable
        ADD PRIMARY KEY (`S.No`),
        ADD UNIQUE KEY `PCID_USER_uk` (`PCID`, `USERNAME`);
    

    【讨论】:

      【解决方案2】:

      我假设您希望每个列都是唯一的,而不是每个复合键都是唯一的。对应该唯一的列使用唯一约束:

      我不确定如果在没有唯一值的列上向 MySQL 添加唯一约束会发生什么。您可能必须先执行手动清理,然后才能添加约束。

      你绝对不应该在 Perl 中这样做。好的数据驱动应用程序是让应用程序的所有逻辑尽可能接近数据模型。这个属于数据库端。

      【讨论】:

      • 我做了清理并给出了这个独特的约束。?但问题是同一行中的不同字段不允许插入..??如何解决这个问题
      • DBD::mysql::st 执行失败:function.pl 第 55 行, 第 17 行的键 2 的重复条目 '203'。
      • 我不明白。这不是你想要的吗?
      【解决方案3】:
      ALTER TABLE MyTable DROP PRIMARY KEY
      
      ALTER TABLE MyTable
          ADD PRIMARY KEY (`S.No`),
          ADD UNIQUE KEY `PCID_uk` (`PCID`),
          ADD UNIQUE KEY `USERNAME_uk` (`USERNAME`)
      

      如果您要从中导入的文件包含重复值并且您希望丢弃重复值,请使用 IGNORE 关键字。如果您使用的是LOAD DATA INFILE,则可以使用如下语法来实现:

      LOAD DATA INFILE 'file_name' IGNORE INTO TABLE ...
      

      this documentation page

      【讨论】:

      • 我试过使用唯一键。问题是只有第一行从文件中插入到表中。之后我得到一个错误,说发现重复项......
      • S.No ,PCID,USERNAME, 时间信息。 1 203 JANE 22:08 更新 2 22:09 删除 3 22:12 修改 它不应允许 pcid 和名称的重复,但应允许插入类型和时间...
      • 您是否查看了该文件以确认实际上没有任何重复值?
      • 该文件包含重复的值。当我将这些值插入到表中时,我应该提供一个限制
      • 我想我明白了。您的转储文件包含重复的值,您希望将其丢弃。我已经用更多信息编辑了我的答案。
      猜你喜欢
      • 2013-12-06
      • 2021-03-12
      • 2016-08-07
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      相关资源
      最近更新 更多