【问题标题】:How to replace null primary keys in MySql如何替换MySql中的空主键
【发布时间】:2017-05-16 01:59:47
【问题描述】:

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

提前感谢您的解决方案。

【问题讨论】:

  • Paradox 表结构不允许大多数其他数据库设计定义的空值,即不匹配任何内容的值,甚至是另一个空值。大多数数据库都有空值,Paradox 有空白。由于 MySQL 没有空格,因此您需要为每种数据类型定义一个用作空格的值。 - 另见stackoverflow.com/questions/10228123/…

标签: mysql paradox


【解决方案1】:

假设 PK 中的 null 意味着它们不需要是唯一的,它们可以是任何值,因此为 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

【讨论】:

    【解决方案2】:

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

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

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

    对于选项(a),

    我建议禁用主键约束并导入数据;然后进行所有必要的更正并重新激活主键。如果您想删除潜在 PK 列中具有空值的行,您还可以使用 IGNORE-keyword,它会在插入时跳过违反 PK 约束的行(参见 primary key and unique index constraints

    选项(b),

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 2016-03-02
      • 2011-10-17
      • 2018-06-28
      • 1970-01-01
      • 2023-02-20
      • 2016-01-01
      • 1970-01-01
      相关资源
      最近更新 更多