Не существует в postgres

#sql #postgresql #sql-insert #postgresql-9.1

#sql #postgresql #sql-вставка #postgresql-9.1

Вопрос:

Я использую postgres db, я пытаюсь выполнить ниже SQL для вставки в таблицу, где ее нет

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

Я хочу, чтобы мой запрос был упрощен, поскольку я буду использовать его в своем коде python с библиотекой pycopg2

 INSERT INTO T1 (a1, a2, a3, a4)
VALUES (123, '20e16411-b8f7', 4, (SELECT u1 from T2 where u2 = 'test@test.com'))
WHERE NOT EXISTS (SELECT a3 
                  FROM TI 
                  WHERE a1 =123 
                    AND a2 = '20e16411-b8f7' 
                    AND a3 = 4 
                    AND a4 = (SELECT u1 from T2 where u2 = 'test@test.com'))
  

SQL Error [42601]: ERROR: syntax error at or near "WHERE" Position: 236

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

 If not exist (select * from t1 where <check>)
Begin
Insert
End
  

Комментарии:

1. помогите нам помочь вам — поделитесь получаемой ошибкой

2. Я обновил вопрос с ошибкой

Ответ №1:

Я думаю, вы хотите insert ... select :

 insert into t1 (a1, a2, a3, a4)
select 123, '20e16411-b8f7', 4, u1
from t2 
where 
    u2 = 'test@test.com'
    and exists (
        select a3 
        from t1 
        where 
            t1.a1 = 123 
            and t1.a2 = '20e16411-b8f7' 
            and t1.a3 = 4 
            and t1.a4 = t2.u1
    )
  

Комментарии:

1. Я отредактировал свой вопрос с лучшим разъяснением

2. @user9185088: Я думаю, что этот запрос выполняет то, что вы хотите.

3. Нет, у меня это не сработало, как будто сначала нужно проверить, существуют ли данные, если нет, то вставить

4. Я обновил запрос if not sample, чего я хочу достичь

5. Я думаю, вам нужно изменить И СУЩЕСТВУЕТ, и НЕ СУЩЕСТВУЕТ.

Ответ №2:

Пусть база данных проверяет уникальность. Определите уникальное ограничение для интересующих вас столбцов:

 create unique index unq_t1_a1_a2_a3_a4 on t1(a1, a2, a3, a4);
  

Затем используйте on conflict :

 insert into T1 (a1, a2, a3, a4)
    select 123, '20e16411-b8f7', 4, t2.u1
    from T2
     where t2.u2 = 'test@test.com'
    on conflict (a1, a2, a3, a4) do nothing;
  

Комментарии:

1. У меня нет доступа к созданию или изменению таблицы

2. @user9185088 … Если эти столбцы должны быть уникальными, вам следует запросить изменение данных для поддержки этого.

Ответ №3:

Вы не можете использовать WHERE после ЗНАЧЕНИЙ, поэтому он выдает ошибку, в этом запросе вы должны использовать SELECT вместо ЗНАЧЕНИЙ, что-то вроде этого;

 INSERT INTO T1 (a1, a2, a3, a4)
SELECT 123, '20e16411-b8f7', 4, (SELECT u1 from T2 where u2 = 'test@test.com')
WHERE NOT EXISTS (SELECT a3 
              FROM TI 
              WHERE a1 =123 
                AND a2 = '20e16411-b8f7' 
                AND a3 = 4 
                AND a4 = (SELECT u1 from T2 where u2 = 'test@test.com'))