आपके पास कई विकल्प हैं।
DB को काम करने दें
अद्वितीय अनुक्रमणिका के साथ अपनी तालिका की एक प्रति बनाएँ - और फिर उसमें अपनी स्रोत तालिका से डेटा डालें:
CREATE TABLE clean LIKE pst_nw;
ALTER IGNORE TABLE clean ADD UNIQUE INDEX (add1, add2, add3, add4);
INSERT IGNORE INTO clean SELECT * FROM pst_nw;
DROP TABLE pst_nw;
RENAME TABLE clean pst_nw;
चीजों को इस तरह से करने का लाभ यह है कि आप अपनी स्रोत तालिका को छोड़ने से पहले सत्यापित कर सकते हैं कि आपकी नई तालिका सही है। नुकसान यह है कि यह दोगुने स्थान लेता है और (अपेक्षाकृत) निष्पादित करने में धीमा है।
DB को #2 काम करने दें
आप ऐसा करके भी मनचाहा परिणाम प्राप्त कर सकते हैं:
set session old_alter_table=1;
ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);
इग्नोर फ़्लैग .. को नज़रअंदाज़ किया जा रहा है
यहां लाभ यह है कि अस्थायी तालिका के साथ कोई गड़बड़ नहीं है - नुकसान यह है कि आपको यह जांचने के लिए नहीं मिलता है कि आपका अपडेट ठीक वही करता है जो आप इसे चलाने से पहले उम्मीद करते हैं।
उदाहरण:
CREATE TABLE `foo` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`one` int(10) DEFAULT NULL,
`two` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
)
insert into foo values (null, 1, 1);
insert into foo values (null, 1, 1);
insert into foo values (null, 1, 1);
select * from foo;
+----+------+------+
| id | one | two |
+----+------+------+
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 3 | 1 | 1 |
+----+------+------+
3 row in set (0.00 sec)
set session old_alter_table=1;
ALTER IGNORE TABLE foo ADD UNIQUE INDEX (one, two);
select * from foo;
+----+------+------+
| id | one | two |
+----+------+------+
| 1 | 1 | 1 |
+----+------+------+
1 row in set (0.00 sec)
डीबी के बाहर इस तरह का काम न करें
विशेष रूप से 40 मिलियन पंक्तियों के साथ डीबी के बाहर ऐसा कुछ करने में बहुत अधिक समय लगने की संभावना है, और यह बिल्कुल भी पूरा नहीं हो सकता है। कोई भी समाधान जो डीबी में रहता है वह तेज़ और अधिक मजबूत होगा।