插入不存在的记录是不是一个坏主意?

时间:2016-12-06 12:25:51

标签: mysql

对于大型数据库,可以使用这样的选择来避免重复插入吗? mysql是否优化了WHERE NOT子句,以及如何或不好的做法。可以说tableA有500万条记录。

INSERT INTO tableA (colA, colB, colC)
(SELECT DISTINCT tableB.a as colA, tableB.b as colB, tableB.c as colC
 FROM tableB
 WHERE NOT tableB.colA IN 
 (SELECT colA FROM tableA)
)

2 个答案:

答案 0 :(得分:3)

如果您不想在create unique index unq_tableA_colA on tableA(colA); 中重复,那么“正确”的方式是让数据库完成工作。所以:

INSERT INTO tableA (colA, colB, colC)
    SELECT DISTINCT tableB.a as colA, tableB.b as colB, tableB.c as colC
    FROM tableB
    ON DUPLICATE KEY UPDATE colA = VALUES(colA);

然后,您可以运行查询,安排忽略任何重复错误:

mongocxx::cursor cursor = collection.find(
  document{} << "Builds.level" << open_document <<
    "$gte" << 1 <<
    "$lte" << 2
  << close_document << finalize);

for(auto doc : cursor) {
  std::cout << bsoncxx::to_json(doc) << "\n";
}

这种方法的优点在于它消除了对竞争条件的担忧。 “同时”发生的两个插入可以在表中插入相同的值“A”。但是,当数据库保证数据的完整性时,就不会发生这种情况。

并且,因为唯一性保证使用索引,所以它不会产生那么多额外开销(如果它没有列上的索引,则会比你的版本少得多)。

答案 1 :(得分:0)

我会将最后一个子查询部分更改为<!DOCTYPE html> <html> <head> File upload system </head> <body> <form action="{% url "upload" %}" method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name=myfile" /> <p><input type="submit" value="upload"/></p> </form> </body> </html> 查询,如

>>> from lstm_predictor import lstm_model