使用空字段删除SQL数据库中的重复条目

时间:2016-12-22 14:53:18

标签: mysql sql

如果有一些空字段,我如何删除SQL数据库中的重复条目: 我有一个表Mesure2包含重复的条目,一些有空字段,我删除了其他重复的条目,如下所示:

INSERT Mesures SELECT distinct * FROM Mesures2;

但仍有重复的空字段条目阻止我创建密钥:

MariaDB [sidonie2]> ALTER TABLE Mesures ADD PRIMARY KEY (`N° Fiche`,Date,Angle,Sépar,`Nb Nuits`,CodeObs,Instrument,dimension,Réf,Nota);
 ERROR 1062 (23000): Duplicate entry '2928-1892.93-258.6-03.34-2-JNS---LDS-' for key 'PRIMARY'

MariaDB [sidonie2]> select * from Mesures where `N° Fiche` = 2928 and Date = 1892.93;
  +-----------+---------+-------+--------+----------+---------+-----------+------------+------+------+
  | N° Fiche  | Date    | Angle | Sépar  | Nb Nuits | CodeObs | dimension | Instrument | Réf  | Nota |
  +-----------+---------+-------+--------+----------+---------+-----------+-----------+------+------+
  |      2928 | 1892.93 | 258.6 | 03.34  |        2 | JNS     | NULL      | NULL       | LDS  |      |
  |      2928 | 1892.93 | 258.6 | 03.34  |        2 | JNS     | NULL      | NULL       | LDS  | NULL |
  +-----------+---------+-------+--------+----------+---------+-----------+------------+------+------+

如何消除只有Null和空相同字段的重复(这里是Nota字段,但可能是其他任何字段)?

3 个答案:

答案 0 :(得分:0)

很奇怪您将整行定义为主键。您是否考虑过自动增量字段?

在任何情况下,如果要删除NULL值,请在插入中执行:

INSERT Mesures(`N° Fiche`, Date, Angle, Sépar, `Nb Nuits`, CodeObs, Instrument, dimension, Réf, Nota)
    SELECT distinct `N° Fiche`, Date, Angle, Sépar, `Nb Nuits`, CodeObs, Instrument, dimension, Réf, Nota
    FROM Mesures2
    WHERE `N° Fiche` IS NOT NULL AND
          Date IS NOT NULL AND
          Angle IS NOT NULL AND
          Sépar IS NOT NULL AND
          `Nb Nuits` IS NOT NULL AND
          CodeObs IS NOT NULL AND
          Instrument IS NOT NULL AND
          dimension IS NOT NULL AND
          Réf IS NOT NULL AND
          Nota IS NOT NULL;

这种方法确实假设表在INSERT之前是空的。

答案 1 :(得分:0)

这取决于您是否要将空值保留为NULL:

INSERT Mesures (`N° Fiche`,Date,Angle,Sépar,`Nb Nuits`,CodeObs,Instrument,dimension,Réf,Nota)
SELECT DISTINCT
    `N° Fiche`,
    Date,
    Angle,
    Sépar,
    `Nb Nuits`,
    CodeObs,
    Instrument,
    dimension,
    Réf,
    nullif(Nota,'')
FROM Mesures2;

或者,如果您希望空值为空字符串:

INSERT Mesures (`N° Fiche`,Date,Angle,Sépar,`Nb Nuits`,CodeObs,Instrument,dimension,Réf,Nota)
SELECT DISTINCT
    `N° Fiche`,
    Date,
    Angle,
    Sépar,
    `Nb Nuits`,
    CodeObs,
    Instrument,
    dimension,
    Réf,
    ifnull(Nota,'')
FROM Mesures2;

请注意,nullif()ifnull()是非常不同的功能。

答案 2 :(得分:-1)

alter IGNORE TABLE tablename add UNIQUE index(col_name)