SQL Запросы массового удаления для составного ключа с запросом фиксированной длины - PullRequest
0 голосов
/ 10 апреля 2020

В Postgresql у меня есть таблица с составным первичным ключом. PRIMARY KEY(id_fnd_users, id_app_apps,id_app_categories)

Я пытаюсь создать запрос для массового удаления и хочу, чтобы этот запрос был фиксированного размера (для целей анализа статистики).

Это то, что я придумал с:

 DELETE FROM app_users_apps_categories
 WHERE
   ("id_fnd_users", "id_app_apps","id_app_categories") 
   in (
          SELECT id_fnd_users, id_app_apps, id_app_categories
          FROM unnest($1::"uuid"[], $2::"uuid"[], $3::"uuid"[]) AS foo(id_fnd_users, id_app_apps,id_app_categories)
        )

и вот пример параметров, которые я установил для этого запроса:

$1 = '{61615807-c654-4844-910c-1609dcf3ff4c,61615807-c654-4844-910c-1609dcf3ff4c}',
$2 = '{25fda4e9-ca83-41fb-98ad-77230a74bbbc,34c0cd50-905e-4ea6-9ccf-baeaa591e98a}', 
$3 = '{NULL,NULL}'

В основном я заканчиваю запросом, подобным этому:

DELETE FROM app_users_apps_categories
        where ("id_fnd_users", "id_app_apps","id_app_categories") in (
          SELECT id_fnd_users, id_app_apps, id_app_categories
          FROM 
            unnest(
                '{61615807-c654-4844-910c-1609dcf3ff4c,61615807-c654-4844-910c-1609dcf3ff4c}'::"uuid"[], 
                '{25fda4e9-ca83-41fb-98ad-77230a74bbbc,34c0cd50-905e-4ea6-9ccf-baeaa591e98a}'::"uuid"[], 
                '{NULL,NULL}'::"uuid"[]
             ) AS foo(id_fnd_users, id_app_apps,id_app_categories)
      )

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

Заранее спасибо.

1 Ответ

1 голос
/ 11 апреля 2020

Как вы передаете свои параметры $ 1, $ 2, $ 3. Но я думаю, это не имеет значения. Ваша проблема, кажется, со значением NULL. Независимо от того, как вы доберетесь до сравнения, от нуля до нуля всегда выдается ноль, и никакие равные (или здесь IN) никогда не будут соответствовать. Как и с любым другим типом данных, вы можете использовать объединение с UUID. Так что

delete 
  from app_users_apps_categories
 where (id_fnd_users
       ,id_app_apps
       ,coalesce(id_app_categories,'00000000-0000-0000-0000-000000000000'::uuid)
       )                             
   in (
        select id_fnd_users
             , id_app_apps
             , coalesce(id_app_categories,'00000000-0000-0000-0000-000000000000'::uuid) 
          from 
               unnest(
                       '{61615807-c654-4844-910c-1609dcf3ff4c,61615807-c654-4844-910c-1609dcf3ff4c}'::uuid[], 
                       '{25fda4e9-ca83-41fb-98ad-77230a74bbbc,34c0cd50-905e-4ea6-9ccf-baeaa591e98a}'::uuid[], 
                       '{null,null}'::uuid[]
                     ) as foo(id_fnd_users, id_app_apps,id_app_categories)  
       ) ;

Вы также можете обернуть это в SQL функцию, возвращающую void:

create or replace function remove_app_users_apps_categories(
                           fnd_users_in uuid[]
                         , app_apps_in  uuid[]
                         , app_cats_in  uuid[]
                         )
  returns void
  language sql 
as $$
delete 
  from app_users_apps_categories
 where (id_fnd_users
       ,id_app_apps
       ,coalesce(id_app_categories,'00000000-0000-0000-0000-000000000000'::uuid)
       )                             
   in (
        select id_fnd_users
             , id_app_apps
             , coalesce(id_app_categories,'00000000-0000-0000-0000-000000000000'::uuid) 
          from 
               unnest( fnd_users_in
                     , app_apps_in 
                     , app_cats_in 
                     ) as foo(id_fnd_users, id_app_apps,id_app_categories)  
       ) ; 
$$; 

Я думаю, что это просто причуды, но я никогда не использую нотацию $ n. Не могу вспомнить, что п означает, что.

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