Как смягчить дубликаты вставок строк на основе неключевого столбца? - PullRequest
1 голос
/ 27 сентября 2011

Мне нужно импортировать данные из одной таблицы MySQL в другую.Старая таблица имеет другую устаревшую структуру (что не очень важно).Тем не менее, я добавляю поле к новой таблице с именем «import_id», которое сохраняет исходный идентификатор из старой таблицы, чтобы предотвратить дублирование импорта старых записей.

Теперь у меня вопрос, как сделатьЯ действительно предотвращаю дубликаты?Из-за параллельного развертывания новой системы со старой, к сожалению, импорт придется запускать более одного раза.Я не могу создать поле "import_id" PK / UNIQUE, потому что оно будет иметь нулевые значения для полей, которые не взяты из старой таблицы, что приводит к ошибке при добавлении новых полей.Есть ли способ использовать какой-нибудь тип INSERT IGNORE на лету для произвольного столбца, который изначально не имеет ограничений?

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

Best.

1 Ответ

2 голосов
/ 27 сентября 2011

Вы должны иметь возможность создать уникальный ключ для столбца import_id и при этом указать этот столбец как обнуляемый. Только столбцы первичного ключа должны быть указаны как NOT NULL.

Тем не менее, в новой таблице вы можете указать уникальный ключ в столбце nullable import_id и затем обрабатывать любые ошибки дублирования ключа при вставке из старой таблицы в новую таблицу с помощью ON DUPLICATE KEY

Вот простой рабочий пример того, к чему я клоню:

create table your_table
(id int unsigned primary key auto_increment,
someColumn    varchar(50) not null,
import_id int null,
UNIQUE KEY `importIdUidx1` (import_id)
);



insert into your_table (someColumn,import_id) values ('someValue1',1) on duplicate key update someColumn = 'someValue1';
insert into your_table (someColumn) values ('someValue2');
insert into your_table (someColumn) values ('someValue3');;
insert into your_table (someColumn,import_id) values ('someValue4',1) on duplicate key update someColumn = 'someValue4';

, где первая и последняя вставки представляют вставки из старой таблицы, а 2-я и 3-я вставки представляют вставки из других мест.

Надеюсь, это поможет и удачи!

...