我有一些要添加到现有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
。还是应该由数据库完成的任务?
答案 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)
在某些情况下,我喜欢这样做:
LOAD DATA
放入临时表INSERT .. ON DUPLICATE KEY .. SELECT x, y, count(*), sum(z), .. GROUP BY x,y
)INSERT [IGNORE] .. SELECT [DISTINCT] ..
或带有SELECT
的IODKU。)有关规范化的更多信息:
AUTO_INCREMENT
id(在极端情况下除外)。由于REPLACE
是DELETE
加上INSERT
,因此几乎可以保证它比IODKU差。但是,当行存在时,两个都将刻录ID。
如果可能的话,不要在所有行中“循环”;而是找到SQL语句来一次处理它们。
根据详细信息,在步骤2(如果有很多重复)中取消重复,或在步骤5(重复不常见)中重复。