sql добавить запись если нет такой
Вставка записи, если ее нету
Нужно в один запрос сделать следующее:
Проверить существование записи в таблице с определенным userId (TEXT), если запись с таким userId существует, то вернуть (выбрать) все данные по этой записи, а если нету, то вставить запись (с определенным набором данных) в таблицу и вернуть данные по этой записе (которую только что вставили).
Как такое можно сделать?
Как восстановить БД если нету бэкапа?
Привет. Суть такова. Раньше у меня стояла Win 8 и был установлен MySQL сервер. На этом сервере была.
Doberman1983, MySQL работает по принципу клиент-сервер. Есть MySQL Сервер, который может одновременно работать с многими Клиентами. Каждый Клиент, который подключается к Серверу, посылает Серверу Запросы. Сервер отвечает Клиенту на его Запросы.
Запросы от разных Клиентов Сервер может выполнять, как ему будет удобнее. Следовательно, между запросом №1 и последующим запросом №2 от одного и того же Клиента Сервер может еще выполнить еще Nцать Запросов от других Клиентов, если это потребуется и он захочет и сможет.
Возвращаясь к сути вопроса, для выборки данных существует запрос SELECT, а для добавления записей в таблицу есть запрос INSERT. Это два разных отдельных запроса. Моя мысль была в том, что обычным решением «в лоб» будет неправильно выполнить сначала SELECT для поиска нужной(-ых) записи(-ей), затем что-то проверять и принимать решение, делать INSERT или нет. Пока Клиент будет принимать решение, быть или не быть, Сервер возмет, да и обработает Запросы от других Клиентов, в связи с чем принятое данным Клиентом решение может стать неактуальным.
MySQL: вставить запись, если не существует в таблице
Я пытаюсь выполнить следующий запрос:
15 ответов
Я на самом деле не предлагаю вам делать это, как как полагают Piskvor и другим-это гораздо лучший способ сделать это, но вы можете на самом деле делать то, что вы пытались:
попробуйте вставить ту же запись еще раз:
вставить другую запись:
что вы можете сделать: создать UNIQUE INDEX на поле, которое должно быть уникальным ( name ), а затем использовать:
MySQL предоставляет очень милое решение:
очень прост в использовании, так как вы объявили уникальный первичный ключ (здесь со значением 5).
здесь запрос mysql, который вставляет записи, если не существует и будет игнорировать существующие подобные записи.
Если вы действительно не можете получить уникальный индекс в таблице, вы можете попробовать.
чтобы преодолеть подобную проблему, я сделал таблицу, которую я вставляю, чтобы иметь уникальный столбец. Используя Ваш пример, при создании у меня было бы что-то вроде:
а затем используйте следующий запрос при вставке в него:
Вы можете легко использовать следующим образом :
таким образом, вы можете вставить новая raw и если у вас есть дубликаты данных, замените определенный столбец ( лучшие столбцы-это временные метки ).
Например :
этот запрос работает правильно:
и вы можете создать таблицу, используя следующий запрос:
Примечание: создайте таблицу, используя второй запрос, прежде чем пытаться использовать первый запрос.
Брайан Хупер : Вы почти попали в точку, но у вас есть ошибка в вашем synatx. Ваша вставка никогда не будет работать. Я тестировал свою базу данных и вот правильный ответ:
Я даю вам мой пример y таблица. Вставка почти такая же, как написал Бьян Хупер, за исключением того, что я поставил select FROM DUAL ont из другой таблицы. СДР с уважением, Иван
вы вставляете, не обновляя результат. Можно определить столбец name в основном столбце или задать его как уникальный.
У меня была проблема, и метод, который Майк посоветовал, работал частично, у меня была ошибка Dublicate Column name = ‘0’, и изменил синтаксис вашего запроса как это’
проблема заключалась в именах столбцов. sum3 был равен sum4 и mysql бросил имена столбцов дубликата, и я написал код в этом синтаксисе, и он работал отлично,
у меня была аналогичная проблема, и мне нужно было вставить несколько, если не существует. Итак, из приведенных выше примеров я пришел к этой комбинации. он здесь на случай, если кому-то понадобится.
уведомления: Я должен был определить имя везде, как требовал MSSQL. MySQL работает с * тоже.
в MySQL: СОЗДАТЬ ТАБЛИЦУ names ( OID инт(11) не null типа AUTO_INCREMENT, name varchar (32) сопоставить utf8_unicode_ci не NULL, ПЕРВИЧНЫЙ КЛЮЧ ( OID ), УНИКАЛЬНЫЙ КЛЮЧ name_UNIQUE ( name ) ) Двигатель=InnoDB в типа AUTO_INCREMENT=1;
в MSSQL: Создать таблицу [имена] ( [OID] INT IDENTITY (1, 1) NOT NULL, [name] NVARCHAR (32) NOT NULL, КЛАСТЕРИЗОВАННЫЙ ПЕРВИЧНЫЙ КЛЮЧ ([OID] ASC) ); Создать уникальный некластеризованный индекс [Index_Names_Name] на [names] ([name] ASC);
этот запрос можно использовать в PHP-код.
у меня есть столбец ID в этой таблице, поэтому мне нужно проверить дублирование для всех столбцов, кроме этого столбца ID:
и теперь новый элемент будет добавлен только в случае, если не существует строки со значениями, настроенными в SET строка
Sql добавить запись если нет такой
Иногда требуется вставить запись в таблицу, если её там до сих пор нет. Можно сделать пару запросов: одним —проверить, другим — вставить, а можно и одним:
Поле login должно быть уникальным.
Комментарии RSS по email OK
Andrey, а почему не replace?
Shadow
REPLACE будет перетирать существующие данные, не пропускать, как в случае с INSERT IGNORE.
Оу… сорри, не заметил начала сообщения 🙂
Sam, ну мы как бы не об аналоге говорим, а о похожих случаях. Никто не спорит, что оно не работает аналогично.
. Можно сделать пару запросов: одним —проверить, другим — вставить.
Ни в коем случае так делать нельзя! Это грубая ошибка. Между первым запросом и вторым пройдет какое-то время. Вполне может оказать, что именно в этот промежуток другой процесс создаст записей, в отсутствии которой вы только что убедились.
век живи век учись 🙂
Алексей, в mysql, если я не ошибаюсь, есть транзакции. А до транзакций для этой цели существовала блокировка таблиц, которая работает и сейчас. То есть в самой проверке-вставке никакой грубой ошибки нет. Другое дело, что это повышает вероятность ошибки из-за того, что программист забудет вставить блокировку, или забудет вовремя разблокировать таблицу.
Проверка и обновление в два запроса в одной транзакции зато гораздо более переносимое решение.
Век живи-век учись. Спасибо. Пригодилось
Отлично, спасибо за пример, очень пригодилось.
Уже не первый день с SQL, и вроде бы такой простой вопрос, а вот только что нашел решение. Большое спасибо!
Спасибо, у меня получилось, пока не поставил нужное поле PRIMARY KEY или UNIQUE.
Здравствуйте а как быть если до вставки ещё выполняется много функций, как перед их выполнением проверить на дубликат с помощью INSERT IGNORE INTO? Вот кучу дублей на собиралось
Как вставить, если не существует в MySQL?
Я начал с Google, и нашел это статьи что говорит о таблицах мьютексов.
у меня есть таблица с
14 миллионов записей. Если я хочу добавить больше данных в том же формате, есть ли способ убедиться, что запись, которую я хочу вставить, уже не существует без использования пары запросов (т. е. один запрос для проверки и один для вставки-это пустой результирующий набор)?
тут unique ограничение на поле гарантию insert не получится, если это уже там?
похоже, что с просто ограничение, когда я выдаю вставку через php, скрипт хрипит.
9 ответов:
использовать INSERT IGNORE INTO table
там же INSERT … ON DUPLICATE KEY UPDATE синтаксис, вы можете найти объяснения на dev.mysql.com
сообщение от bogdan.org.ua согласно webcache от Google:
для начала: начиная с последней версии MySQL, синтаксис, представленный в заголовке, не является вероятный. Но есть несколько очень простых способов сделать то, что есть ожидается использование существующей функциональности.
представьте, что у нас есть таблица:
теперь представьте, что у нас есть автоматический конвейер импорта зачетно метаданные от Ensembl, и что в силу различных причин конвейер может быть нарушена на любом этапе исполнения. Таким образом, нам нужно обеспечить два вещи: 1) повторные исполнения трубопровода не разрушат наше база данных, и 2) повторные исполнения не умрет из-за » дубликат ошибки первичного ключа.
метод 1: Использование REPLACE
если запись существует, она будет перезаписана; если она еще не существует существует, он будет создан. Однако использование этого метода не является эффективным для нашего случая: нам не нужно перезаписывать существующие записи, это нормально просто, чтобы пропустить их.
Метод 2: с помощью вставки игнорировать также очень просто:
здесь, если ‘ensembl_transcript_id’ уже присутствует в база данных, она будет молча пропущена (проигнорирована). (Если быть более точным, вот цитата из справочного руководства MySQL: «если вы используете IGNORE ключевое слово, ошибки, которые возникают при выполнении инструкции INSERT являются вместо этого рассматривается как предупреждение. Например, без игнорирования, строка, которая дублирует существующий уникальный индекс или значение первичного ключа в таблице вызывает ошибку повторяющегося ключа и оператор прерывается.».) Если запись еще не существует, она будет создана.
этот второй метод имеет несколько потенциальных недостатков, в том числе не прерывание запроса в случае возникновения каких-либо других проблем (см. руководство.) Таким образом он должен быть использован если ранее испытанный без Игнорировать ключевое слово.
в качестве последнего уведомления: этот пост был вдохновлен Xaprb. Я бы также посоветовал обратитесь к его другому сообщению о написании гибкого SQL запросы.
Обновить если запись есть; Создать если записи нет
Ребят подскажите как оптимизировать программу, ибо занимает очень много времени на.
триггеры на проверку если запись есть то пропустить если нет то добавить.
есть триггер но он работает только при добавлении одной записи. мне нужно что бы он просматривал.
Directorosea, пример из гугла:
Jodah, Привет! Ну а что расписывать. если только предметно:
Добавлено через 53 секунды
UPDATE. WHERE тоже работает..
Решение
ДА? а я вроде как понял мануалы, что там указывается то значение, по которому надо найти строку и в ней замену )
Добавлено через 4 минуты
Попробовал. нет. Все я правильно делал. Просто не работает.
Добавлено через 5 минут
Вообще запутался:
Найти строку где есть указанный во вход. данных id и обновить в этой строке значения dt tm ip cmd
Если нет строки с таким id, то ее соответственно нужно создать.
Я окончательно запутался, Можете скинуть конкретный применительно к этой ситуации запрос? каков он?
Добавлено через 17 секунд
Jodah,
Добавлено через 12 минут
Уфф.. все заработало. я неправильно представлял принцип работы этой команды. честно говоря и сейчас не очень мне их задумка понравилась. должно быть другое решение. Вообщем этому полю id еще нужно было поставить опцию что оно первичное.