Mysql 在加载到数据库之前规范化数据还是使用数据库?

Mysql 在加载到数据库之前规范化数据还是使用数据库?,mysql,database-design,relational-database,Mysql,Database Design,Relational Database,我有一些数据要添加到现有的mysql数据库中。新数据可能包含已保存在DB上的条目。因为我的一些列是唯一的,所以正如预期的那样,我得到了一个ER_DUP_输入错误 批量插入 假设我想使用下面的语句将A、B和C保存在表mytable的列名中,A已经保存在那里 在mytable名称中插入值A、B、C; 有没有一种方法可以直接使用大容量插入来保存B和C,而忽略a?还是必须为每一新行构建一个insert语句?这引出了另一个问题: 标准化数据 我是否应该保证在实际的insert语句之前不上传重复的条目?在我

我有一些数据要添加到现有的mysql数据库中。新数据可能包含已保存在DB上的条目。因为我的一些列是唯一的,所以正如预期的那样,我得到了一个ER_DUP_输入错误

批量插入 假设我想使用下面的语句将A、B和C保存在表mytable的列名中,A已经保存在那里

在mytable名称中插入值A、B、C; 有没有一种方法可以直接使用大容量插入来保存B和C,而忽略a?还是必须为每一新行构建一个insert语句?这引出了另一个问题:

标准化数据
我是否应该保证在实际的insert语句之前不上传重复的条目?在我的例子中,我需要从数据库中选择数据,消除重复项,然后执行上面看到的插入。或者,这是一项应该由数据库完成的任务吗?

如果您有阻止导入的唯一约束,您有几种方法可以解决这一问题:

INSERT IGNORE INTO mytable ...
如果任何单个行违反唯一约束,则跳过它们。插入其他行

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

INSERT INTO mytable ... ON DUPLICATE KEY UPDATE ...
更灵活。这不会删除原始行,但允许您根据具体情况为选择的任何列设置新值。另见我对这一问题的答复

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

阅读文档了解更多信息:


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

将数据加载到临时表中 清理数据 根据需要正常化。需要规范化的每列2个SQL- 扩充摘要表插入。。在重复键上。。选择x、y、count*、sumz、。。按x,y分组 将清理数据从临时表复制到实际表事实表。插入[忽略]。。选择[不同]。。或者用SELECT。 有关规范化的更多信息:

我不做任何交易。有多种原因可以解释为什么这样更好。 在最坏的情况下,由于其他失败,我偶尔会在规范化表中抛出一个未使用的条目。没什么大不了的。 除边缘情况外,不燃烧自动增量ID。 非常快。 因为REPLACE是DELETE-plus-INSERT,所以它几乎肯定比IODKU更糟糕。但是,当行存在时,两个burn ID都会被烧掉

如果可能,不要在行中循环;而是查找SQL语句以同时处理它们


根据详细信息,如果大量重复或步骤5中的重复不常见,请在步骤2中执行重复数据消除。

通常情况下,我认为这是由数据库服务器处理的。看看这个堆栈问题:如果我做对了,我就不能使用批量插入来完成那个任务了?因为它在那里的显示方式,它会检查每个条目是否已经存在。