提出的解决方案
#
# Step 01) Create Temp Key Tables
#
CREATE TABLE KeysToKeep
(
id INT NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE KeysToDrop LIKE KeysToKeep;
#
# Step 02) Collect All id values you want to Keep
#
INSERT INTO KeysToKeep
SELECT id FROM
(SELECT MAX(id) id,Author, Name, TrackNum, title_id
FROM db.table GROUP BY Author, Name, TrackNum, title_id) A
;
#
# Step 03) Collect All id values you want to Drop
#
INSERT INTO KeysToDrop
SELECT A.id FROM db.table A LEFT JOIN KeysToKeep USING (id) WHERE B.id IS NULL;
#
# Step 04) Do the Mass Delete
#
DELETE A.* FROM db.table A INNER JOIN KeysToDrop B USING (id);
#
# Step 05) Remove Temp Key Tables
#
DROP TABLE KeysToKeep;
DROP TABLE KeysToDrop;
提出的解决方案(短版)
#
# Step 01) Create Temp Key Table
#
CREATE TABLE KeysToKeep
(
id INT NOT NULL,
PRIMARY KEY (id)
);
#
# Step 02) Collect All id values you want to Keep
#
INSERT INTO KeysToKeep
SELECT id FROM
(SELECT MAX(id) id,Author, Name, TrackNum, title_id
FROM db.table GROUP BY Author, Name, TrackNum, title_id) A
;
#
# Step 03) Do the Mass Delete
#
DELETE A.* FROM db.table A LEFT JOIN KeysToKeep B USING (id) WHERE B.id IS NULL;
#
# Step 04) Remove Temp Key Table
#
DROP TABLE KeysToKeep;
提出的解决方案(偏执版)
#
# Step 01) Create Temp Key Table
#
CREATE TABLE KeysToKeep
(
id INT NOT NULL,
PRIMARY KEY (id)
);
#
# Step 02) Collect All id values you want to Keep
#
INSERT INTO KeysToKeep
SELECT id FROM
(SELECT MAX(id) id,Author, Name, TrackNum, title_id
FROM db.table GROUP BY Author, Name, TrackNum, title_id) A
;
#
# Step 03) Copy the Tables to Keep to Another Temp Table
#
CREATE TABLE db.table_new LIKE db.table;
INSERT INTO db.table_new
SELECT A.* FROM db.table A INNER JOIN KeysToKeep B USING (id);
#
# Step 04) Swap New and Old Tables
#
ALTER TABLE db.table RENAME db.table_old;
ALTER TABLE db.table_new RENAME db.table;
#
# Step 05) Remove Temp Key Table
#
DROP TABLE KeysToKeep;
#
# Step 06) Drop the Old Table If the Content of db.table is Correct
#
DROP TABLE db.table_old;
EPILOGUE
在前两种情况下s,请检查KeysToKeep
和/或KeysToDrop
以确保它们是保留或丢弃的关键。在最后一种情况下,如果您确定,请删除表格db.table_old
。如果你不确定,你可以这样回滚:
ALTER TABLE db.table RENAME db.table_new;
ALTER TABLE db.table_old RENAME db.table;
给它一个尝试!
感谢您的精彩回应。我现在正在测试环境中完成这项工作。我尝试了偏执版。首先,我用db名称替换了所有db的出现。我得到一个语法错误,所以删除了一个额外的';'。然后我得到一个错误:错误代码:1248.每个派生表都必须有自己的别名。有任何想法吗? – 2014-10-11 22:05:14
我忘了在步骤02中放置一个别名。请再试一次... – RolandoMySQLDBA 2014-10-13 16:52:11
确定试过,现在我得到这个错误...'你的SQL语法错误;请检查与您的MySQL服务器版本相对应的手册,以便在'INSERT INTO KeysToKeep'附近使用正确的语法。选择ID号码 (第12行的SELECT MAX(id)id,作者,名称,T'注意我删除了一个额外的分号我之前提到过(第7行) – 2014-10-13 20:19:28