Изменение поля таблицы на UNIQUE - PullRequest
2 голосов
/ 15 июня 2009

Я хочу запустить следующую команду sql:

ALTER TABLE `my_table` ADD UNIQUE (
`ref_id` ,
`type`
);

Проблема в том, что некоторые данные в таблице могут сделать это недопустимым, поэтому изменение таблицы завершится неудачей.

Есть ли в MySQL умный способ удалить дублирующиеся строки?

Ответы [ 8 ]

4 голосов
/ 15 июня 2009

SQL может в лучшем случае справиться с этим произвольно. Другими словами, это ваша проблема.

У вас есть данные, которые в настоящее время не являются уникальными. Вы хотите сделать его уникальным. Вам нужно решить, как обращаться с дубликатами.

Существует множество способов справиться с этим:

  • Изменение или удаление дублирующихся строк вручную, если числа достаточно малы;
  • Выполнение операторов для обновления или удаления дубликатов, соответствующих определенным критериям, для достижения точки, где исключения могут рассматриваться на индивидуальной основе;
  • Копирование данных во временную таблицу, очистка оригинала и использование запросов для повторного заполнения таблицы; и
  • и т. Д.

Примечание: все это требует вмешательства пользователя.

Конечно, вы могли бы просто скопировать таблицу во временную таблицу, очистить оригинал и скопировать в строки, игнорируя только те, которые потерпели неудачу, но я ожидаю, что это не даст вам результатов, которые вы действительно хотите.

2 голосов
/ 15 июня 2009

если вам все равно, какая строка удаляется, используйте IGNORE:

ALTER IGNORE TABLE `my_table` ADD UNIQUE (
`ref_id` ,
`type`
);
0 голосов
/ 02 марта 2010

Это сработало для меня:

ALTER TABLE table_name ADD UNIQUE KEY field_name (field_name)
0 голосов
/ 15 июня 2009

Вот фрагмент, который я использовал для удаления дублирующихся строк в одной из таблиц

BEGIN TRANSACTION
Select *,
rank() over (Partition by PolicyId, PlanSeqNum, BaseProductSeqNum, 
        CoInsrTypeCd, SupplierTypeSeqNum
            order by CoInsrAmt desc) as  MyRank
into #tmpTable
from PlanCoInsr 

select distinct PolicyId,PlanSeqNum,BaseProductSeqNum,
        SupplierTypeSeqNum, CoInsrTypeCd, CoInsrAmt 
into #tmpTable2
from #tmpTable where MyRank=1

truncate table PlanCoInsr

insert into PlanCoInsr
    select * from #tmpTable2

drop table #tmpTable
drop table #tmpTable2

COMMIT
0 голосов
/ 15 июня 2009

Есть хорошая статья базы знаний, которая предлагает пошаговый подход к поиску и удалению строк, имеющих повторяющиеся значения. Он обеспечивает два подхода - одноразовый подход для поиска и удаления одной строки и более широкое решение для решения этой проблемы, когда задействовано много строк.

http://support.microsoft.com/kb/139444

0 голосов
/ 15 июня 2009

В прошлом я занимался экспортом уникального набора данных, удалением таблицы, воссозданием ее с уникальными столбцами и импортом данных.

Это часто быстрее, чем пытаться понять, как удалить дублирующиеся данные.

0 голосов
/ 15 июня 2009

Что вы можете сделать, это добавить столбец временных идентификаторов в вашу таблицу. При этом вы можете написать запрос для идентификации и удаления дубликатов (вы можете немного изменить запрос, чтобы сохранить только одну копию из набора повторяющихся строк).

Как только это будет сделано, удалите временный столбец и добавьте уникальное ограничение к исходному столбцу.

Надеюсь, это поможет.

0 голосов
/ 15 июня 2009

Вам нужно будет найти другое уникальное поле, потому что удаление по ref_id и одному только типу удалит их все.

Чтобы получить дубликаты:

select ref_id, type from my_table group by ref_id, type having count(*)>1

У Xarpb есть несколько хитрых трюков (возможно, слишком умных): http://www.xaprb.com/blog/2007/02/06/how-to-delete-duplicate-rows-with-sql-part-2/

...