MySQL: вставить запись, если не существует в таблице - PullRequest
336 голосов
/ 02 июля 2010

Я пытаюсь выполнить следующий запрос:

INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name='value'
);

Но это возвращает ошибку.По сути, я не хочу вставлять запись, если поле «имя» записи уже существует в другой записи - как проверить, является ли новое имя уникальным?

Ответы [ 15 ]

4 голосов
/ 03 июня 2012

Брайан Хупер: Вы почти достигли цели, но у вас есть ошибка в вашем синтаксисе.Ваша вставка никогда не будет работать.Я проверил на своей базе данных и вот правильный ответ:

INSERT INTO podatki (datum,ura,meritev1,meritev1_sunki,impulzi1,meritev2,meritev2_sunki,impulzi2)
            SELECT '$datum', '$ura', '$meritve1','$sunki1','$impulzi1','$meritve2','$sunki2','$impulzi2'
                FROM dual
                WHERE NOT EXISTS (SELECT datum,ura
                                      FROM podatki
                                      WHERE datum='$datum' and ura='$ura'

Я даю вам мой пример таблицы y.Вставка - почти то же самое, что написал Bian Hooper, за исключением того, что я поместил select FROM DUAL из другой таблицы.С уважением, Иван

3 голосов
/ 08 января 2017

У меня была похожая проблема, и мне нужно было вставить несколько, если они не существуют. Итак, из приведенных выше примеров я пришел к этой комбинации ... она здесь на всякий случай, если кому-то понадобится.

Примечание: Мне приходилось определять имя везде, как того требовал MSSQL ... MySQL тоже работает с *.

INSERT INTO names (name)
SELECT name
FROM
(
  SELECT name
  FROM
  (
     SELECT 'Test 4' as name
  ) AS tmp_single
  WHERE NOT EXISTS
  (
     SELECT name FROM names WHERE name = 'Test 4'
  )
  UNION ALL
  SELECT name
  FROM
  (
     SELECT 'Test 5' as name
  ) AS tmp_single
  WHERE NOT EXISTS
  (
     SELECT name FROM names WHERE name = 'Test 5'
  )
) tmp_all;

MySQL: CREATE TABLE names ( OID int (11) NOT NULL AUTO_INCREMENT, name varchar (32) COLLATE utf8_unicode_ci NOT NULL, ПЕРВИЧНЫЙ КЛЮЧ (OID), УНИКАЛЬНЫЙ КЛЮЧ name_UNIQUE (name) ) ENGINE = InnoDB AUTO_INCREMENT = 1;

или

MSSQL: CREATE TABLE [имена] ( [OID] INT IDENTITY (1, 1) НЕ ПУСТО, [имя] NVARCHAR (32) НЕ NULL, ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕРНЫЙ ([OID] ASC) ); СОЗДАТЬ УНИКАЛЬНЫЙ НЕКЛАСТЕРНЫЙ ИНДЕКС [Index_Names_Name] ON [имена] ([имя] ASC);

3 голосов
/ 15 декабря 2015

У меня была проблема, и метод, который Майк посоветовал, работал частично, у меня была ошибка Dublicate Column name = '0', и я изменил синтаксис вашего запроса так:с именами столбцов.sum3 был равен sum4, а mysql выбрасывал дублирующие имена столбцов, и я написал код в этом синтаксисе, и он отлично работал,

3 голосов
/ 02 июля 2010

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

1 голос
/ 20 ноября 2017

Этот запрос можно использовать в коде PHP.

У меня есть столбец ID в этой таблице, поэтому мне нужно проверить наличие дубликатов для всех столбцов, кроме этого столбца ID:

#need to change values
SET @goodsType = 1, @sybType=5, @deviceId = asdf12345SDFasdf2345;    


INSERT INTO `devices` (`goodsTypeId`, `goodsId`, `deviceId`) #need to change tablename and columnsnames
SELECT * FROM (SELECT @goodsType, @sybType, @deviceId) AS tmp
WHERE NOT EXISTS (
    SELECT 'goodsTypeId' FROM `devices` #need to change tablename and columns names
    WHERE `goodsTypeId` = @goodsType
        AND `goodsId` = @sybType
        AND `deviceId` = @deviceId
) LIMIT 1;

и теперь новый элемент будет добавлен только в случае, если не существует строки со значениями, настроенными в SET string

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...