在加载到数据库或使用数据库之前对数据进行规范化?

时间:2018-08-09 18:13:51

标签: mysql database-design relational-database

我有一些要添加到现有mysql数据库中的数据。新数据可能具有条目,这些条目已经保存在DB中。由于我的某些列是唯一的,所以按预期出现了ER_DUP_ENTRY错误。

批量插入

假设我要使用以下语句将“ A”,“ B”和“ C”保存在表names的列mytable中,并且“ A”已经保存在那里。

insert into mytable (names) values ("A"), ("B"), ("C");

是否有一种方法可以直接使用bulk insert来保存“ B”和“ C”,而忽略“ A”?还是我必须为每个新行构建一个insert语句?这导致了另一个问题:

规范化数据

我应该保证在实际的insert语句之前 之前不上传重复的条目吗?就我而言,我需要从数据库中select进行数据删除,消除重复项,然后执行上面看到的insert。还是应该由数据库完成的任务?

2 个答案:

答案 0 :(得分:1)

如果您有阻止导入的UNIQUE约束,则有几种解决方法:

INSERT IGNORE INTO mytable ...

如果任何单个行违反UNIQUE约束,则将其跳过。插入其他行。

REPLACE INTO mytable ...

如果任何行违反UNIQUE约束,请删除现有行,然后插入新行。请记住这样做的副作用,例如,如果您有外键在删除时级联引用了已删除的行。或者,如果INSERT生成新的自动增量ID。

INSERT INTO mytable ... ON DUPLICATE KEY UPDATE ...

更大的灵活性。这不会删除原始行,但是允许您根据具体情况为选择的任何列设置新值。另请参阅我对"INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"

的回答

如果要对mysqlimport或等效的SQL语句LOAD DATA INFILE使用批量加载,则有一些选项与INSERT IGNORE或REPLACE解决方案匹配,但与INSERT ... ON DUPLICATE KEY不匹配UPDATE解决方案。

阅读文档以获取更多信息:

答案 1 :(得分:0)

在某些情况下,我喜欢这样做:

  1. LOAD DATA放入临时表
  2. 清理数据
  3. 根据需要进行标准化。 (每列2个SQL需要规范化-details
  4. Augment Summary表(INSERT .. ON DUPLICATE KEY .. SELECT x, y, count(*), sum(z), .. GROUP BY x,y
  5. 将干净数据从临时表复制到实际表(“事实”表)。 ({INSERT [IGNORE] .. SELECT [DISTINCT] ..或带有SELECT的IODKU。)

有关规范化的更多信息:

  • 我在任何交易之外都这样做。更好的原因有多种。
  • 在最坏的情况下(由于其他故障),我有时会在规范化表中抛出一个未使用的条目。没什么。
  • 不刻录AUTO_INCREMENT id(在极端情况下除外)。
  • 很快。

由于REPLACEDELETE加上INSERT,因此几乎可以保证它比IODKU差。但是,当行存在时,两个都将刻录ID。

如果可能的话,不要在所有行中“循环”;而是找到SQL语句来一次处理它们。

根据详细信息,在步骤2(如果有很多重复)中取消重复,或在步骤5(重复不常见)中重复。