2011-04-23 112 views
2

的副本我有表中查找如下:刪除某些領域

Field  | Type   | Null | Key | Default | Extra 
----------+--------------+---------+--------+---------+---------------- 
index  | int(11)  | NO  | PRI | NULL | auto_increment 
itemid | int(11)  | NO  |  | NULL | 
name  | varchar(32) | NO  |  | NULL | 
meta  | int(11)  | NO  |  | NULL | 

表小,我沒有在意optimalisation。

一些記錄已itemidname,並meta重複,但我想刪除所有那些name複製,留下一個記錄(即不再重複。)這是MySQL的。我尋找解決方案,但我沒有發現任何事情讓我滿足我的需求。

+0

指數是一個保留字。重命名它會更好,所以每次調用它時都不會被強制使用反引號。 – 2011-04-23 11:52:27

+0

@nick rulez:並重寫使用此表的代碼? ;-) – zerkms 2011-04-23 11:57:18

+0

嗨。 alter table tbl_name change'index' id int not null auto_increment; – 2011-04-23 12:22:12

回答

3

由於數據是小可能是簡單的創建具有相似結構的表並執行這樣的查詢:

INSERT INTO new_table (index, itemid, name, meta) 
SELECT index, itemid, name, meta FROM old_table GROUP BY name 

之後刪除old_table和重命名new_table

還可以工作的解決方案(我不知道)將與IGNORE創建唯一索引,像

ALTER IGNORE TABLE tblname 
ADD UNIQUE INDEX ix_name (name) 

忽視的是一個MySQL擴展到標準SQL。它控制着ALTER TABLE如何在新表中的唯一鍵上存在重複或如果啓用嚴格模式時發生警告。如果未指定IGNORE,則複製將被中止並在發生重複鍵錯誤時回退。如果指定了IGNORE,則只有第一行用於具有唯一鍵上重複的行,其他衝突行將被刪除。不正確的值將被截斷爲最接近的匹配可接受值。

+0

這就是我正在尋找,確切地說︰ CREATE TABLE itemstemp AS SELECT * FROM items GROUP BY name' – Sebi 2011-04-23 11:47:32

+0

@Sebi:yup,方便的解決方案。但也嘗試添加獨特的索引,這將有助於減少步驟。 – zerkms 2011-04-23 11:51:05

1

不知道如果你在找什麼,但你可以嘗試在GROUP BY子句

SELECT index, itemid, name, meta FROM table GROUP BY name