2017-01-01 8 views
1

Мне нужно перенести старую базу данных Paradox на MySql. База данных Paradox содержит составные первичные ключи с нулевыми значениями (составные клавиши состоят из 3,4 или 5 полей и могут иметь 1 или 2 поля с нулевым значением). Проблема заключается в том, что значения null в pk не разрешены в MySql. Невозможно заменить нулевые значения непосредственно в Paradox (5 миллионов строк в некоторых таблицах), так как мы можем это сделать?Как заменить нулевые первичные ключи в MySql

Заранее благодарим за ваши решения.

+0

Paradox структура таблицы не позволяет аннулирует, как это определено в большинстве других проектов баз данных, то есть, значение, которое ничего не соответствует, даже еще один нуль. Если в большинстве баз данных есть значения null, у Paradox есть пробелы. Поскольку у MySQL нет пробелов, вам нужно определить значение, которое будет использоваться как пустое, для каждого типа данных. - См. Также http://stackoverflow.com/questions/10228123/how-does-paradox-manage-null-and-empty-values/13282514#13282514 –

ответ

0

Я думаю, что у вас есть два варианта в БД MySQL,

(а) использовать ПК, который требует, чтобы заменить нулевые значения/игнорировать такие строки

(б) использовать UNIQUE- ограничение, которое по-прежнему допускает нулевые значения вместо PK.

Для варианта (а),

Я хотел бы предложить, чтобы отключить ограничение первичного ключа и импорта данных; затем выполните все необходимые исправления и активируйте первичный ключ. Если вы хотите, чтобы избавиться от строк с нулевыми значениями в столбцах потенциальных PK, можно также использовать в IGNORE, который -ключевое слово пропускает строки, нарушающие PK-ограничения при вставке (см primary key and unique index constraints)

Вариант (б) ,

должно разрешить импортировать данные как есть. Затем вы можете сделать исправления или оставить данные как есть.

0

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

Чтобы сделать это, создайте триггер на таблицу MySQL, как это:

delimiter // 
create trigger trig_pk_col_1 before insert on mytable 
for each row 
begin 
    set new.pk_col_1 = coalesce(new.pk_col_1, 999); 
    set new.pk_col_2 = coalesce(new.pk_col_2, 999); 
    -- etc for other 
end;// 
delimiter ; 

Я выбрал 999 как произвольное ненулевое значение, но вы можете выбрать что-нибудь.

Если логика должна быть более сложной, вы можете ее кодировать по своему усмотрению.

Кроме того, я использовал coalesce() для краткости, но вы можете использовать более подробный if вместо этого, если вы предпочитаете:

if new.pk_col_1 is null then 
    set new.pk_col_1 = 999; 
end if; 
-- etc