Учитывая, что эта проблема (чрезвычайно) распространена , я просмотрел ответы и нашел следующую страницу:
Как я могу сделать «вставить, если не существует» в MySQL?
Я не знаю Я не хочу использовать INSERT IGNORE или другие операторы, специфичные для MariaDB/MySQL, если это возможно, поэтому я особенно посмотрел на второй (https://stackoverflow.com/a/3025332/19358731) и 7-й (https://stackoverflow.com /a/9590881/19358731) ответы.
Затем я вспомнил, что отдельные операторы SQL являются не атомарными:
Является ли один оператор SQL Server атомарным и последовательным?
Это заставляет меня поверить, что решения, представленные в моих первых ссылках, действительно неверны, поскольку потенциально могут иметь множество одновременных запросов - я думаю, что подзапрос SELECT в каждом операторе INSERT в этих ответах не будет выполняться атомарно в соответствующем родительском операторе INSERT.
У меня два взаимодополняющих вопроса:
- является ли решение (INSERT INTO table SELECT ... NOT EXISTS (SELECT ...)), действительно указанный в моей первой ссылке, верно? Действительно ли запросы безопасны (атомарны)?
в дополнение к моему первому вопросу, могу ли я также использовать следующий PHP-код для удовлетворения своих потребностей (я думаю, производительность будет ниже):< /li>
$pdo->beginTransaction();
$statement = $pdo->prepare("SELECT ... FROM table WHERE conditions LIMIT 1");
$statement->execute();
if ($row = $statement->fetch()) {
$statement2 = $pdo->prepare("INSERT INTO table ...");
$statement2->execute();
}
$pdo->commit();
Подробнее здесь: https://stackoverflow.com/questions/787 ... e-concerns