Əsas səhifə > MySQL > Find duplicate records in table

Find duplicate records in table

Cədvəldə təkrar məlumatları necə aşkarlayaq?
Və yaxud da təkrar məlumat daxil edilmiş column-a necə unique index əlavə edək?
Cədvəlimiz:

CREATE TABLE dup_entry (
    id INT(11) NOT NULL AUTO_INCREMENT,
    a INT,
    b INT,
    PRIMARY KEY (id)
);

Və məlumatlarımız:

INSERT INTO dup_entry (a,b) VALUES (10,11),(10,11), (11,12),(12,13);

mysql> select * from dup_entry;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |   10 |   11 |
|  2 |   10 |   11 |
|  3 |   11 |   12 |
|  4 |   12 |   13 |
+----+------+------+
4 rows in set (0.00 sec)

Təbii ki məlumat sayı daha da çox ola bilər. Təkrarlanmış məlumatlar gördüyümüz kimi 10,11-di.
Təkrar məlumatları aşkarlamaq üçün sorğu:

mysql> select a,b,count(*) as cnt from dup_entry group by a,b having cnt>1;
+------+------+-----+
| a    | b    | cnt |
+------+------+-----+
|   10 |   11 |   2 |
+------+------+-----+
1 row in set (0.00 sec)

İndi isə a və b-ni unique edək.

mysql> alter table dup_entry add unique index(a,b);
ERROR 1062 (23000): Duplicate entry '10-11' for key 'a'

Məhşur error-u görürük. Onda belə çıxır ki biz bütün duplicate məlumatları delete edib daha sonra unique əlavə etməliyik? Xoşbəxtlikdən MySQL-in belə bir extension-u var. alter ignore:

mysql> ALTER IGNORE TABLE dup_entry ADD UNIQUE INDEX(a,b);
ERROR 1062 (23000): Duplicate entry '10-11' for key 'a'

Ooops. yenidən bu error-u verdi. Həlləri:
1. İnnoDB-dən MyİSAM-a müvəqqəti switch edirik:

-- 1
mysql> alter table dup_entry engine=myisam;
Query OK, 4 rows affected (0.36 sec)
Records: 4  Duplicates: 0  Warnings: 0
-- 2
mysql> ALTER IGNORE TABLE dup_entry ADD UNIQUE INDEX(a,b);
Query OK, 4 rows affected (0.16 sec)
Records: 4  Duplicates: 1  Warnings: 0

mysql> select * from dup_entry;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |   10 |   11 |
|  3 |   11 |   12 |
|  4 |   12 |   13 |
+----+------+------+
3 rows in set (0.00 sec)

Gördüyünüz kimi duplicate row-nu tapdı və avtomatik olaraq sildi, həmçinin də unique key əlave etdi.

mysql> show create table dup_entry;

 CREATE TABLE `dup_entry` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `a` (`a`,`b`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

2. old_alter_table alqoritmini aktiv edirik. Bu MySQL 5.0 versiyadan daha əvvəlki versiyalarda istifadə olunan bir üsuldur. Bu zaman MySQL Alter üçün temporary table yaradır, köhnə datanı həmin temporary cədvələ kopyalayır, alter edir daha sonra da rename edərək yeni cədvəl şəklində təqdim edir.
Default olaraq old_alter_table-ın qiyməti 0-dır yəni istifadə olunmur.

mysql> select @@old_alter_table;
+-------------------+
| @@old_alter_table |
+-------------------+
|                 0 |
+-------------------+
1 row in set (0.00 sec)

Biz dəyişirik və qiymətini 1 edirik:

mysql> set @@session.old_alter_table=1\G
Query OK, 0 rows affected (0.00 sec)

mysql> select @@session.old_alter_table;
+---------------------------+
| @@session.old_alter_table |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

Daha sonra da sınayırıq:

mysql> ALTER IGNORE TABLE dup_entry ADD UNIQUE INDEX(a,b);
Query OK, 4 rows affected (1.12 sec)
Records: 4  Duplicates: 1  Warnings: 0

mysql> select * from dup_entry;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |   10 |   11 |
|  3 |   11 |   12 |
|  4 |   12 |   13 |
+----+------+------+
3 rows in set (0.00 sec)

Bu üsul zamanı engine-ı dəyişməyə ehtiyac qalmır.

Təşəkkürlər😉

Kateqoriyalar: MySQL Etiketlər: ,
  1. Hələlik heç bir şərh yoxdur
  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: