Я написал хранимую процедуру с именем таблицы в качестве параметра, который проверяет наличие дубликатов строк в этой таблице. Операторы построены динамически, конечно:
INSERT INTO tmpTable
SELECT col1, col2,... FROM table GROUP BY col1, col2, ... HAVING COUNT(*) > 1;
DELETE FROM tablename FROM tablenname
INNER JOIN tmpTable ON ISNULL(tablename.col1, 0) = ISNULL(tmpTable.col1, 0)
AND ISNULL(tablename.col2, 0) = ISNULL(tmpTable.col2, 0)
AND ...;
INSERT INTO tablename SELECT * FROM tmpTable;
Должна работать до сих пор, но проблема в том, что она терпит неудачу, когда в таблице есть столбцы blob, такие как текст. Их нельзя сравнивать в JOIN
. Я также пробовал
DELETE FROM tablename GROUP BY col1, col2, ... HAVING COUNT(*) > 1;
но GROUP BY
не поддерживается в операторе DELETE
напрямую без самоподключения.
Также невозможно запросить information_schema для первичного ключа этой таблицы, так как ни одна из этих таблиц не имеет этого.
Есть идеи? Благодарю.