如何在MySql中替换空主键

时间:2017-01-01 20:27:40

标签: mysql paradox

我必须将旧的Paradox数据库迁移到MySql。 Paradox数据库包含具有空值的复合主键(复合键由3,4或5个字段组成,它可以有1或2个具有Null值的字段)。问题是在MySql中不允许使用pk中的空值。在Paradox中直接替换空值是不可能的(在某些表中有5百万行),那么我们怎么办呢?

提前感谢您的解决方案。

2 个答案:

答案 0 :(得分:0)

我认为你在MySQL DB中有两个选择,

(a)使用PK,需要替换空值/忽略此类行

(b)使用UNIQUE约束,它仍然允许空值,而不是PK。

对于选项(a),

我建议禁用主键约束并导入数据;然后执行所有必要的更正并重新激活主键。如果你想在可能的PK列中删除具有空值的行,你也可以使用<includeonly>[[Category:Album:{{{Album|Urban Hymns}} }]]</includeonly> - 关键字,它会在插入时跳过违反PK约束的行(参见primary key and unique index constraints

选项(b),

应该允许按原样导入数据。然后,您可以进行更正或保留数据。

答案 1 :(得分:0)

假设PK中的空值意味着它们不需要是唯一的,它们可以是任何值,因此将任意值赋给空值。

为此,在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