Ответы пользователя по тегу PostgreSQL
  • Как перенести данные из одной таблицы в другую не нарушив ограничения целостности БД в PostgresSQL?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    Ну у вас скорее наследование с условиями распределения, а не партиционирование, но можно и так.

    Ошибка в том, что старую таблицу так же надо делать партицией (в вашем случае потомком)
    ALTER TABLE ticket RENAME TO ticket_part_default;
    CREATE TABLE ticket (LIKE ticket_part_default);
    ALTER TABLE ticket_part_default INHERIT ticket;
    ...

    Далее все как у вас, только удаление делать из ticket_part_default
    Ответ написан
    1 комментарий
  • Почему 'ТНЭ-12' имеет тип unknown?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    decodes(class_tne, 'ТНЭ-1Т'::text, all_cur, 0))  as generation_off_t


    Потому, что приведение типа надо делать, иначе как догадаться, что у вас:
    'a,b' - TEXT, CHAR(3), VARCHAR(), ...
    '1' - SMALLINT, INTEGER, BIGINT, TEXT, ... 
    '{a,b}' - TEXT[], CHAR(1)[], VARCHAR(...)[], ...
    '{1,2}' - TEXT[], SMALLINT[], INTEGER[], BIGINT[], ...
    '{"a":"b"}' - JSON, JSONB

    Поди догадайся, что имелось ввиду.
    Ответ написан
    Комментировать
  • Почему GROUP BY так медленно выполняется?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    Что бы понять, почему запрос меденный следует начать с EXPLAIN ANALYZE:
    EXPLAIN ANALYZE
    SELECT name, count(*) as similar_names_count
    FROM users
    WHERE name = ANY('{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}')
    GROUP BY name
    LIMIT 100;


    И показать результат, либо самому увидеть, что по полю name делается sec scan и идекса на нем нет.
    Ответ написан
    Комментировать
  • Как добавить переменную в запрос?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    Вы серьезно?
    SELECT $1 + make_interval( months => $2);

    Ну ок, функция:

    CREATE OR REPLACE FUNCTION public.add_months (
      date,
      integer
    )
    RETURNS date AS
    $body$
    SELECT $1 + make_interval( months => $2);
    $body$
    LANGUAGE 'sql';
    Ответ написан
    Комментировать
  • Как получить скрипты всех объектов бд postgres-14?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    Простым запросом - никак.
    Можно создать хранимку типа такой:
    CREATE OR REPLACE FUNCTION generate_create_table_statement(p_table_name varchar)
      RETURNS text AS
    $BODY$
    DECLARE
        v_table_ddl   text;
        column_record record;
    BEGIN
        FOR column_record IN 
            SELECT 
                b.nspname as schema_name,
                b.relname as table_name,
                a.attname as column_name,
                pg_catalog.format_type(a.atttypid, a.atttypmod) as column_type,
                CASE WHEN 
                    (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                     FROM pg_catalog.pg_attrdef d
                     WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN
                    'DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                                  FROM pg_catalog.pg_attrdef d
                                  WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
                ELSE
                    ''
                END as column_default_value,
                CASE WHEN a.attnotnull = true THEN 
                    'NOT NULL'
                ELSE
                    'NULL'
                END as column_not_null,
                a.attnum as attnum,
                e.max_attnum as max_attnum
            FROM 
                pg_catalog.pg_attribute a
                INNER JOIN 
                 (SELECT c.oid,
                    n.nspname,
                    c.relname
                  FROM pg_catalog.pg_class c
                       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
                  WHERE c.relname ~ ('^('||p_table_name||')$')
                    AND pg_catalog.pg_table_is_visible(c.oid)
                  ORDER BY 2, 3) b
                ON a.attrelid = b.oid
                INNER JOIN 
                 (SELECT 
                      a.attrelid,
                      max(a.attnum) as max_attnum
                  FROM pg_catalog.pg_attribute a
                  WHERE a.attnum > 0 
                    AND NOT a.attisdropped
                  GROUP BY a.attrelid) e
                ON a.attrelid=e.attrelid
            WHERE a.attnum > 0 
              AND NOT a.attisdropped
            ORDER BY a.attnum
        LOOP
            IF column_record.attnum = 1 THEN
                v_table_ddl:='CREATE TABLE '||column_record.schema_name||'.'||column_record.table_name||' (';
            ELSE
                v_table_ddl:=v_table_ddl||',';
            END IF;
    
            IF column_record.attnum <= column_record.max_attnum THEN
                v_table_ddl:=v_table_ddl||chr(10)||
                         '    '||column_record.column_name||' '||column_record.column_type||' '||column_record.column_default_value||' '||column_record.column_not_null;
            END IF;
        END LOOP;
    
        v_table_ddl:=v_table_ddl||');';
        RETURN v_table_ddl;
    END;
    $BODY$
      LANGUAGE 'plpgsql' COST 100.0 SECURITY INVOKER;
    
    SELECT generate_create_table_statement('tablename');


    Но это не самое лучшее решение.
    Все же pg_dump -s - предпочтительнее
    Ответ написан
    1 комментарий
  • Как составить правильно SQL запрос с JSON?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    SELECT 
        t2,json_data->>'0' AS title,
        t2,json_data->>'1' AS name,
        t2,json_data->>'2' AS age,
        ...
    FROM some_base_2 AS t1
    JOIN some_base AS t2 ON t2.id=5
    ...
    Ответ написан
    Комментировать
  • Где лучше генерировать uuid для базы? В коде или в sql запросом?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    По большому счету - без разницы.
    Но сильно зависит от того, каким образом осуществляется генерация UUID на клиенте.
    Например, при использовании rand основанного на времени, я сталкивался с проблемой уникальности при плотной вставке записей в базу данных (при плотности записи больше 10К per sec данная ошибка будет проявлятся стабильно).
    Ответ написан
    Комментировать
  • Как сделать чтобы None равнялось любому значению?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    Во-первых, не None, а NULL

    В принципе сравнение полей которые могут быть NULL лучше осуществлять так:

    t1.field IS NOT DISTINCT FROM t2.field

    Или так, но дольше:

    COALESCE(t1.field, '') = COALESCE(t2.field, '')

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

    SELECT 
    ...
    AND ( t1.age || t1.growth || t1.hair || t1.size || t1.weight ) IS NOT NULL
    AND ( t2.age || t2.growth || t2.hair || t2.size || t2.weight ) IS NOT NULL
    Ответ написан
    Комментировать
  • При создании таблица возникла ошибка как как ее решить?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    cur.execute(f'''CREATE TABLE "{user_id}"  
                         (ADMISSION INT PRIMARY KEY NOT NULL,
                         NAME TEXT NOT NULL,
                         AGE INT NOT NULL,
                         COURSE CHAR(50),
                         DEPARTMENT CHAR(50));''')


    Если уж используете что попало в именах таблиц, то используйте двойные кавычки
    Ответ написан
    Комментировать
  • Как сравнить ряды в двух разных таблицах?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    SELECT *
        FROM table1 AS t1
        LEFT JOIN table2 AS t2
            ON t1.id = t2.id
        WHERE 
            t1.id = ? AND
            row_to_json(t1.*) @> row_to_json(t2.*) AND
            row_to_json(t1.*) <@ row_to_json(t2.*);
    Ответ написан
  • Как указать схему при подключении к Postgresql nodejs?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    SET search_path TO <название нужной схемы>,public;

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

    Я, в своей практике, всегда в запросах указываю схему:

    SELECT * FROM "myschema"."mytable";
    
    UPDATE "catalog"."goods" SET "price" = 100 WHERE "id" = 10;


    И так далее.

    Причем советую при указании имен объектов базы данных всегда использовать двойные кавычки, потому что:
    - имя объекта может пересекаться с ключевыми словами PostgreSQL (KEYWORDS);
    - если имя используется без кавычек, то оно всегда приводитс в lowercase;
    Ответ написан
    Комментировать
  • Как правильно использовать индексы PostgreSQL?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    1. Для того что бы понять, работает индек или нет, а так же как он вообще работает в консоле базы данных следует выполнить EXPLAIN ANALYZE, в Вашем случае:
    EXPLAIN ANALYZE SELECT * FROM b WHERE a_id='123' ORDER BY time DESC;

    2. Скорее всего в Вашем случае скорость запроса зависит не сколько от работы индекса, сколько от количества записей возвращаемых запросом для разных a_id. Почему нет LIMIT ?
    Ответ написан
    7 комментариев
  • Как сделать выборку записей таблицы по условию для значений из связной таблицы?

    phoinixrw
    @phoinixrw
    Архитектор информационных систем
    DELETE FROM table1
        WHERE id IN ( 
            SELECT t1.id 
                FROM table1 AS t1 
                INNER JOIN table2 AS t2 
                    ON ...
                WHERE ... )
    Ответ написан
    Комментировать