SQL для вставки, только если определенное значение уже не присутствует в таблице? - PullRequest
1 голос
/ 16 ноября 2011

Как вставить число в таблицу, только если в таблице еще нет этого числа?

Я ищу конкретный код SQL, не совсем уверенный, как к этому подойти.Пробовал несколько вещей, ничего не работает.

РЕДАКТИРОВАТЬ

Таблица выглядит следующим образом:

PK   ID    Value
1     4     500
2     9     3

Так что, если я пытаюсь INSERT (ID, Value) VALUES (4,100), он не должен пытаться это сделать!

Ответы [ 3 ]

5 голосов
/ 16 ноября 2011

Если ID должен быть уникальным, в таблице должно быть определено уникальное ограничение.Это приведет к ошибке, если вы попытаетесь вставить уже существующее значение

ALTER TABLE table_name
  ADD CONSTRAINT uk_id UNIQUE( id );

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

BEGIN
  INSERT INTO table_name( id, value ) 
    VALUES( 4, 100 );
EXCEPTION
  WHEN dup_val_on_index
  THEN
    <<do something>>
END;

Вы также можете закодировать INSERT, чтобы он вставлял 0 строк (вы все равно хотите, чтобы уникальное ограничение былос точки зрения модели данных и потому, что это дает оптимизатору больше информации и может сделать будущие запросы более эффективными)

INSERT INTO table_name( id, value )
  SELECT 4, 100
    FROM dual
   WHERE NOT EXISTS( 
    SELECT 1
      FROM table_name
     WHERE id = 4 )

Или вместо этого можно кодировать MERGE, чтобы обновить столбец VALUE из 500до 100 вместо вставки новой строки.

3 голосов
/ 16 ноября 2011

Попробуйте оператор MERGE:

MERGE INTO tbl USING
    (SELECT 4 id, 100 value FROM dual) data
ON (data.id = tbl.id)
WHEN NOT MATCHED THEN
    INSERT (id, value) VALUES (data.id, data.value)
0 голосов
/ 16 ноября 2011
INSERT INTO YOUR_TABLE (YOUR_FIELD)
SELECT '1' FROM YOUR_TABLE YT WHERE YT.YOUR_FIELD <> '1' LIMIT 1

Конечно, это «1» будет вашим числом или вашей переменной.Вы можете использовать INSERT + SELECT для решения этой проблемы.

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