2013-08-17 3 views
1

У меня есть место MySQL БД содержат 3 колонкиУдалить повторяющиеся строки в MySQL

Country  State   City 
US   California  Los Angeles 
AU   Queensland  Brisbane 
AU   Victoria  Southbank 
AU   Queensland  Brisbane 

Как я могу удалить дубликаты строк в MySQL Query?

DELETE FROM location WHERE country IN (
    SELECT * FROM table_name 
    GROUP BY country, state, city 
    HAVING COUNT(*) > 
); 

Я попробовал этот запрос, но он не работает

+0

вы не указали после «count (*)>» введите число после и затем попробуйте один раз. –

+0

Имеет ли таблица какой-либо первичный ключ или подобное, что делает его уникальным, или это действительно только эти 3 столбца? –

ответ

3

Ваш запрос имеет многочисленные вопросы:

DELETE FROM location 
where country in (SELECT * 
        FROM table_name 
        GROUP BY country, state, city 
        having COUNT(*)>); 

Такие, как: (1) вы возвращаете более одного столбца из подзапроса, но по сравнению с только один столбец. (2) У вас нет номера после сравнения. (3) Он относится к двум различным таблицам.

Способ структурирования ваших данных (без уникального идентификатора в строке), сложно определить, какие строки удалить. Я бы предположил, что вместо этого вы используете метод truncate. А затем научиться ставить авто Инкрементирование идентификатор в каждой таблице:

create temporary table tmpLocation as 
    select country, state, city from location; 

truncate table location; 

insert into location(country, state, city) 
    select distinct country, state, city 
    from tmpLocation; 

drop table tmpLocation; 

На больших таблиц с большим количеством удалений, это более эффективно, а также.

1

Вы забыли упомянуть count(*)>1

DELETE FROM location 
where country in (
SELECT * 
FROM table_name 
GROUP BY country, state, city 
having COUNT(*)>1); 

Просто для информации. Вы также можете использовать ALTER IGNORE TABLE для удаления дубликатов.

Что-то вроде этого: -

ALTER IGNORE TABLE location ADD UNIQUE INDEX (COLUMN1, COLUMN2) 
1

Вы должны удалить повторяющиеся строки с помощью ALTER запроса

ALTER IGNORE TABLE location ADD UNIQUE INDEX index_name(Country, State, City); 

Или otherwise вы можете удалить дубликаты строк с помощью ниже Синтаксис запросов

DELETE 
FROM table_name 
WHERE col1 IN ( 
    SELECT MAX(col1) 
    FROM tab_name 
    GROUP BY col1, col2, col3, .... 
    HAVING COUNT(*) > 1) 
4

Выберите отдельные строки и поместить их в новую таблицу:

CREATE TEMPORARY TABLE location_temp AS SELECT DISTINCT * FROM location 

усечение таблицы:

DELETE FROM location; 

Populate из таблицы с различными значениями

INSERT INTO location(Country, State, City) SELECT Country, State, City FROM location_temp; 

Ресурс: http://www.databasejournal.com/features/mysql/article.php/2201621/Deleting-Duplicate-Rows-in-a-MySQL-Database.htm