developppのblog

木下やま人の技術メモ

カテゴリ: PostgreSQL

DBセッションの中でタイムアウトを設定する方法

statement_timeout

指定されたミリ秒を越えてコマンドがクライアントからサーバに届いたどんなコマンドの実行も停止します。

--SQL実行時間が1秒以上経過したとき自動的にキャンセルされるよう設定

SET statement_timeout TO 1000;

SELECT * FROM test;

ERROR: ステートメントのタイムアウトによりステートメントをキャンセルしています



--タイムアウトの設定をリセット

RESET statement_timeout;




lock_timeout

テーブル、インデックス、行、またはその他のデータベースオブジェクトに対してロック獲得を試みている最中、指定されたミリ秒数を超えて待機するいかなる命令も停止されます。

時間制限はそれぞれのロック取得の試みに対し個別に適応されます。 制限は明示的ロック要求(例えばLOCK TABLE、またはSELECT FOR UPDATE without NOWAITなど)および暗黙的に取得されるロックに適用されます。

--ロック取得に1秒以上経過したとき自動的にキャンセルされるよう設定

SET lock_timeout TO 1000;

update test set column1 = ?;

ERROR: ステートメントのタイムアウトによりステートメントをキャンセルしています



--タイムアウトの設定をリセット

RESET lock_timeout;




https://www.postgresql.jp/document/9.3/html/runtime-config-client.html

CSVの作成と取込


SELECT結果をCSVに出力


--CSV作成
copy (select * from test_table) to '/tmp/ファイル名.csv';



CSVからテーブルにデータ作成


--CSVからデータ取込
copy test_table from '/tmp/ファイル名.csv';


inser文発行時に自動採番する方法

serial型

テーブルを作成する際に、自動的に番号を採番したいフィールドに対しserial型を指定する。
※serial型を指定すると自動的にシーケンスが作成される。

create table sequence_test (
  auto_no serial ,
  name varchar(50),
  primary key(auto_no)
);

insert into sequence_test (name) values('test1');
insert into sequence_test (name) values('test2');

select * from sequence_test;
--auto_no, name
--1, test1
--2, test2

--sequence_test_auto_no_seqというシーケンスが自動的に作成され連番を振っている。



シーケンスを作成しcreta tableに組み込む

テーブルを作成する際に、あらかじめ作成したシーケンスを指定する。

create sequence sequence_test_seq;

create table sequence_test (
  auto_no int DEFAULT nextval('sequence_test_seq'),
  name varchar(50),
  primary key(auto_no)
);

insert into sequence_test (name) values('test1');
insert into sequence_test (name) values('test2');

select * from sequence_test;
--auto_no, name
--1, test1
--2, test2



GROUP BY、HAVINGを使用し重複行の抽出

SELECT
  カラム1                -- 重複しているカラム1
  ,COUNT(カラム1)   -- 重複件数
FROM
 テーブル1
GROUP BY
 カラム1
HAVING COUNT(カラム1) > 1 ;  -- 2つ以上重複しているカラムを対象

PostgreSQLの最大範囲

文字型
VARCHAR(n) 1GB (=10485760)
CHAR(n) 1GB (=10485760)
TEXT 1GB (=10485760)
create table test_table (
  test_column varchar(10485761)
);

実行結果:
   ERROR: 型varcharの長さは10485760を超えられません
   LINE 2: test_column varchar(10485761)


数値型
INTEGER 4バイト
SMALLINT 2バイト
BIGINT 8バイト
NUMERIC 1000桁
REAL 4バイト
DOUBLE PRECISION 8バイト
create table test_table (
  test_column INTEGER
);

insert into test_table (test_column) values(12345678901)

実行結果:
   ERROR: ERROR: integerの範囲外です


日付型
DATE 4バイト
TIMESTAMP 8バイト


バイナリ型
bytea 1GB
ラージオブジェクト 2GB

↑このページのトップヘ