1.) Коли вам потрібно додати повідомлення до запиту, ви можете використовувати вкладений коментар
SELECT
a, b, c
FROM mytab;
2.) Видаліть кінцеві пробіли з усіх полів text
та та varchar
з бази даних.
do $$
declare
selectrow record;
begin
for selectrow in
select
'UPDATE '||c.table_name||' SET '||c.COLUMN_NAME||'=TRIM('||c.COLUMN_NAME||') WHERE '||c.COLUMN_NAME||' ILIKE ''% '' ' as script
from (
select
table_name,COLUMN_NAME
from
INFORMATION_SCHEMA.COLUMNS
where
table_name LIKE 'tbl%' and (data_type='text' or data_type='character varying' )
) c
loop
execute selectrow.script;
end loop;
end;
$$;
3.) Ми можемо використовувати функцію вікна для дуже ефективного видалення повторюваних рядків:
DELETE FROM tab
WHERE id IN (SELECT id
FROM (SELECT row_number() OVER (PARTITION BY column_with_duplicate_values), id
FROM tab) x
WHERE x.row_number > 1);
Деякі оптимізовані версії PostgreSQL (з ctid):
DELETE FROM tab
WHERE ctid = ANY(ARRAY(SELECT ctid
FROM (SELECT row_number() OVER (PARTITION BY column_with_duplicate_values), ctid
FROM tab) x
WHERE x.row_number > 1));
4.) Коли нам потрібно визначити стан сервера, ми можемо використовувати функцію:
SELECT pg_is_in_recovery();
5.) Отримайте команду DDL функцій.
select pg_get_functiondef((select oid from pg_proc where proname = 'f1'));
6.) Безпечна зміна типу даних стовпців у PostgreSQL
create table test(id varchar );
insert into test values('1');
insert into test values('11');
insert into test values('12');
select * from test
id
character varying
1
11
12
З наведеної вище таблиці видно, що я використовував тип даних -
стовпець "ідентифікатор" для символів . Але це була помилка, тому що я завжди даю цілі числа як id. Тож використання varchar тут - погана практика. Тож спробуємо змінити тип стовпця на ціле число.
ALTER TABLE test ALTER COLUMN id TYPE integer;
Але воно повертається:
ПОМИЛКА: стовпець “id” не може бути автоматично переданий для введення цілочисельного стану SQL: 42804 Підказка: Вкажіть вираз USING для виконання перетворення
Це означає, що ми не можемо просто змінити тип даних, оскільки дані вже є в стовпці. Оскільки дані мають тип "змінюється за символами", postgres не може очікувати, що це ціле число, хоча ми ввели лише цілі числа. Отже, як запропонував postgres, ми можемо використовувати вираз «USING», щоб передати наші дані у цілі числа.
ALTER TABLE test ALTER COLUMN id TYPE integer USING (id ::integer);
Це працює.
7.) Знати, хто підключений до бази даних
Це більш-менш команда моніторингу. Щоб знати, який користувач підключений до якої бази даних, включаючи їх IP та порт, використовуйте такий SQL:
SELECT datname,usename,client_addr,client_port FROM pg_stat_activity ;
8.) Перезавантаження конфігураційних файлів PostgreSQL без перезапуску сервера
Параметри конфігурації PostgreSQL містяться у спеціальних файлах, таких як postgresql.conf та pg_hba.conf. Часто вам може знадобитися змінити ці параметри. Але щоб деякі параметри набули чинності, нам часто потрібно перезавантажити файл конфігурації. Звичайно, це зробить перезапуск сервера. Але у виробничому середовищі не бажано перезапускати базу даних, яку використовують тисячі, лише для встановлення деяких параметрів. У таких ситуаціях ми можемо перезавантажити файли конфігурації без перезапуску сервера, використовуючи таку функцію:
select pg_reload_conf();
Пам'ятайте, це не працює для всіх параметрів, деякі зміни параметрів потребують повного перезапуску сервера, щоб вступити в силу.
9.) Отримання шляху до каталогу даних поточного кластера баз даних
Можливо, що в системі кілька екземплярів (кластер) PostgreSQL налаштовано, як правило, в різних портах або близько того. У таких випадках пошук того, який каталог (каталог фізичного сховища) використовується яким екземпляром, є напруженим завданням. У таких випадках ми можемо використати таку команду в будь-якій базі даних кластера, який нас цікавить, щоб отримати шлях до каталогу:
SHOW data_directory;
Цю саму функцію можна використовувати для зміни каталогу даних кластера, але для цього потрібно перезапустити сервер:
SET data_directory to new_directory_path;
10.) Знайти CHAR - це ДАТА чи ні
create or replace function is_date(s varchar) returns boolean as $$
begin
perform s::date;
return true;
exception when others then
return false;
end;
$$ language plpgsql;
Використання: наступне поверне значення True
select is_date('12-12-2014')
select is_date('12/12/2014')
select is_date('20141212')
select is_date('2014.12.12')
select is_date('2014,12,12')
11.) Змініть власника в PostgreSQL
REASSIGN OWNED BY sa TO postgres;
12.) PGADMIN PLPGSQL DEBUGGER
Добре пояснено тут