sql insert если нет такой записи

Sql insert если нет такой записи

Иногда требуется вставить запись в таблицу, если её там до сих пор нет. Можно сделать пару запросов: одним —проверить, другим — вставить, а можно и одним:

Поле login должно быть уникальным.

Комментарии RSS по email OK

Andrey, а почему не replace?

Shadow

REPLACE будет перетирать существующие данные, не пропускать, как в случае с INSERT IGNORE.

Оу… сорри, не заметил начала сообщения 🙂

Sam, ну мы как бы не об аналоге говорим, а о похожих случаях. Никто не спорит, что оно не работает аналогично.

. Можно сделать пару запросов: одним —проверить, другим — вставить.

Ни в коем случае так делать нельзя! Это грубая ошибка. Между первым запросом и вторым пройдет какое-то время. Вполне может оказать, что именно в этот промежуток другой процесс создаст записей, в отсутствии которой вы только что убедились.

век живи век учись 🙂

Алексей, в mysql, если я не ошибаюсь, есть транзакции. А до транзакций для этой цели существовала блокировка таблиц, которая работает и сейчас. То есть в самой проверке-вставке никакой грубой ошибки нет. Другое дело, что это повышает вероятность ошибки из-за того, что программист забудет вставить блокировку, или забудет вовремя разблокировать таблицу.

Проверка и обновление в два запроса в одной транзакции зато гораздо более переносимое решение.

Век живи-век учись. Спасибо. Пригодилось

Отлично, спасибо за пример, очень пригодилось.

Уже не первый день с SQL, и вроде бы такой простой вопрос, а вот только что нашел решение. Большое спасибо!

Спасибо, у меня получилось, пока не поставил нужное поле PRIMARY KEY или UNIQUE.

Здравствуйте а как быть если до вставки ещё выполняется много функций, как перед их выполнением проверить на дубликат с помощью INSERT IGNORE INTO? Вот кучу дублей на собиралось

Источник

Вставка записи, если ее нету

Нужно в один запрос сделать следующее:
Проверить существование записи в таблице с определенным 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 insert если нет такой записи. Смотреть фото sql insert если нет такой записи. Смотреть картинку sql insert если нет такой записи. Картинка про sql insert если нет такой записи. Фото sql insert если нет такой записиОбновить если запись есть; Создать если записи нет
Ребят подскажите как оптимизировать программу, ибо занимает очень много времени на.

триггеры на проверку если запись есть то пропустить если нет то добавить.
есть триггер но он работает только при добавлении одной записи. мне нужно что бы он просматривал.

Directorosea, пример из гугла:

Jodah, Привет! Ну а что расписывать. если только предметно:

Добавлено через 53 секунды
UPDATE. WHERE тоже работает..

Решение

ДА? а я вроде как понял мануалы, что там указывается то значение, по которому надо найти строку и в ней замену )

Добавлено через 4 минуты
Попробовал. нет. Все я правильно делал. Просто не работает.

Добавлено через 5 минут
Вообще запутался:

Найти строку где есть указанный во вход. данных id и обновить в этой строке значения dt tm ip cmd
Если нет строки с таким id, то ее соответственно нужно создать.

Я окончательно запутался, Можете скинуть конкретный применительно к этой ситуации запрос? каков он?

Добавлено через 17 секунд
Jodah,

Добавлено через 12 минут
Уфф.. все заработало. я неправильно представлял принцип работы этой команды. честно говоря и сейчас не очень мне их задумка понравилась. должно быть другое решение. Вообщем этому полю id еще нужно было поставить опцию что оно первичное.

Источник

SQL INSERT INTO: примеры вставки строк в таблицу БД MySQL

SQL оператор INSERT используется для вставки записей в существующую таблицу.

Синтаксис этого оператора следующий:

Создадим тестовую таблицу

Давайте создадим таблицу table1 со столбцами a, b, c в нашей MySQL базе данных:

Запрос на вставку строки

Простой запрос, который вставляет строку со столбцами 111, 222 и 333 выглядит так:

Еще один способ сделать то же самое:

Столбцы, которые вы не перечислите заполняются значениями по умолчанию, которые вы предусматриваете при создании таблицы, даже если это просто NULL.

У таблиц обычно есть поле id с первичным ключом (PRIMARY KEY) таблицы. Если этому полю установлено значение AUTOINCREMENT т.е. оно заполняется автоматически, то в таком случае вы не должны его перечислять в списке столбцов оператора INSERT.

Вставка без перечисления столбцов

Если количество значений, которые мы вставляем = количеству столбцов в таблице, то можно не перечислять столбцы, и наш запрос может выглядеть так:

Этот способ крайне не рекомендуется. Дело в том, что со временем вы можете менять таблицы, например добавлять в них новые столбцы, а это значит, что все запросы записанные таким способом просто перестанут работать и вам придется менять их по всему вашему приложению. Поэтому, навсегда забываем этот способ. Я его привел, только чтобы вы так не делали.

Вставка сразу нескольких строк с помощью INSERT INTO

Если нам нужно вставить несколько строк, то мы просто перечисляем группы значений через запятую выглядит это так:

Таким образом мы вставили 3 строки в нашу таблицу table1. Их может быть и больше. В MySQL четкого предела нет, однако он все таки существует и зависит от параметра max_allowed_packet который ограничивает размер запроса. Если вы установите SET GLOBAL max_allowed_packet=524288000; то размер запроса будет ограничен 500MB но делайте это в очень крайнем случае. Обычно всегда можно найти решение и разделить 1 большой запрос, на несколько более мелких и вставлять например не больше 1000 строк за один цикл.

Допустим у нас есть еще одна таблица table2 которая по структуре точно такая же как и первая. Нам в таблицу table2 нужно вставить все строки из table1.

Вставляем значения из table1 в таблицу table2:

Вам следует позаботиться об уникальности ключей, если они есть в таблице, в которую мы вставляем. Например при дублировании PRIMARY KEY мы получим следующее сообщение об ошибке:

Если вы делаете не какую-то единичную вставку при переносе данных, а где-то сохраните этот запрос, например в вашем PHP скрипте, то всегда перечисляйте столбцы.

Как не рекомендуется делать (без перечисления столбцов):

Если у вас со временем изменится количество столбцов в таблице, то запрос перестанет работать. При выполнении запроса MySQL в лучшем случае просто будет возвращать ошибку:

Либо еще хуже: значения вставятся не в те столбцы.

А теперь представим, что нам нужно вставить только те строки из table1, у которых столбец «c» равен 333. Тогда наш запрос будет выглядеть так

То есть мы просто вставляем данные в таблицу, которые выбрали из другой таблицы при помощи обычного SELECT запроса

Теперь в столбец d у нас записалась единица и проблема решена.

Если вам нужно вставить строки в определенный раздел таблицы, то нужно после таблицы указать PARTITION (название раздела), например так:

Вставка в несколько разделов. Первая строка вставляется в раздел p1, а вторая в p2

Вставка строк, некоторые из которых уже существуют в целевой таблице

Существование строк определяется по значению уникальных ключей. В зависимости от ситуации мы можем выбрать разные способы поведения при совпадении значений уникальных столбцов.

Игнорирование INSERT IGNORE INTO

Например если мы вставляем строку с PK = 1, и при этом в таблице уже есть PK = 1 то MySQL выдаст ошибку:

Выполнение запроса на этом прервется, однако нам в некоторых случаях хотелось бы просто вставить данные, игнорируя ошибки. В этом нам поможет INSERT IGNORE INTO:

Просто добавляем IGNORE в наш запрос и ошибки будут игнорироваться

Вставка с заменой существующих значений REPLACE INTO

REPLACE работает также INSERT, но если совпадают уникальные ключи, то старая строка (или строки!) удаляется до вставки новой.

В таком случае наш пример выглядит следующим образом:

Обновление некоторых полей, при существовании строк ON DUPLICATE KEY UPDATE

При совпадении ключей, мы можем также заменить некоторые или все поля в строке.

Наш запрос будет выглядеть так:

В данном примере если у нас какой-то уникальный ключ совпадает, то мы не производим вставку, а обновляем существующую строку или строки путем присваивания столбцу «c» значения, которое у нас перечислено в VALUES.

Иными словами, если ключ совпадает, то мы просто обновим данные столбца «с» а остальные столбцы трогать не будем.

Иногда нам нужно при совпадении ключей обновить все значения. Этом можно сделать просто перечислив все столбцы:

При обновлении столбцов мы также можем использовать разные выражения, например:

Выражения для вставляемых значений в VALUES

При вставке значений, мы можем использовать выражения и даже использовать в своих выражениях значения других столбцов.

Пример использования выражений:

Таким образом мы для формирования столбца «c» использовали столбцы «a» и «b».

Приоритет вставки INSERT LOW_PRIORITY / HIGH_PRIORITY

Установление приоритета нужно для решение проблем с конкурентными вставками. При вставках происходит блокировка строк и если 2 INSERT запроса требуют блокировки одних и тех же строк, для своего выполнения, то иногда может потребоваться повысить или понизить приоритет некоторых запросов, по отношению к другим. Это можно сделать указав приоритет LOW_PRIORITY или HIGH_PRIORITY

Наш запрос будет выглядеть так для LOW_PRIORITY:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *