CREATE TABLE IF NOT EXISTS 人物 (
--id integer NOT NULL PRIMARY KEY AUTOINCREMENT,
id SERIAL NOT NULL PRIMARY KEY ,
姓 varchar(256) NOT NULL,
名 varchar(256) NOT NULL,
補助情報 varchar(256) NULL
);
CREATE TABLE IF NOT EXISTS 施設 (
--id integer NOT NULL PRIMARY KEY AUTOINCREMENT,
id SERIAL NOT NULL PRIMARY KEY ,
施設名 varchar(256) NOT NULL,
所在地 varchar(256) NOT NULL,
補助情報 varchar(256) NULL,
UNIQUE(施設名)
);
CREATE TABLE IF NOT EXISTS 利用控え (
--id integer NOT NULL PRIMARY KEY AUTOINCREMENT,
id SERIAL NOT NULL PRIMARY KEY ,
人物id integer NOT NULL,
施設id integer NOT NULL,
利用日 date NULL
);
-- id定義はSQLiteとPostgreSQLの記述法の違いにより2つ用意しました
SELECT MIN(利用控え.利用日),MAX(利用控え.利用日)
FROM 利用控え
JOIN 人物 ON 利用控え.人物id = 人物.id
JOIN 施設 ON 利用控え.施設id = 施設.id
GROUP BY 施設.所在地,人物.姓,人物.名
HAVING 施設.所在地='渋谷' AND 人物.姓='鈴木' AND 人物.名='次郎';
sqlite> SELECT MIN(利用控え.利用日),MAX(利用控え.利用日)
...> FROM 利用控え
...> JOIN 人物 ON 利用控え.人物id = 人物.id
...> JOIN 施設 ON 利用控え.施設id = 施設.id
...> GROUP BY 施設.所在地,人物.姓,人物.名
...> HAVING 施設.所在地='渋谷' AND 人物.姓='鈴木' AND 人物.名='次郎';
MIN(利用控え.利用日) MAX(利用控え.利用日)
------------- -------------
2021/08/09 2021/08/15
#!/bin/bash
# UTF-8 LF
# setFDW.sh
# このコマンドはtest_userで起動することを想定しています
# host 192.168.1.139,192.168.1.143 上のpostgreSQLに
# アクセスする記述となっていますので、実情に合わせ
# 変更する必要があります。
#=============================
# 基本設定
#============================================
psql -U postgres -d fdw_test<< EOT
DROP FOREIGN TABLE IF EXISTS foreign_table_1;
DROP FOREIGN TABLE IF EXISTS foreign_table_2;
--
DROP USER MAPPING IF EXISTS FOR test_user SERVER foreign1;
DROP USER MAPPING IF EXISTS FOR test_user SERVER foreign2;
DROP SERVER IF EXISTS foreign1;
DROP SERVER IF EXISTS foreign2;
DROP EXTENSION IF EXISTS postgres_fdw ;
----------------------------------------------
-- postgres_fdw導入
----------------------------------------------
CREATE EXTENSION IF NOT EXISTS postgres_fdw ;
SELECT * FROM pg_extension;
----------------------------------------------
-- server作成
----------------------------------------------
-- hostは環境に合わせて設定のこと
CREATE SERVER IF NOT EXISTS foreign1
FOREIGN DATA WRAPPER postgres_fdw OPTIONS
(host '192.168.1.139', port '5432', dbname 'fdw_test');
-- hostは環境に合わせて設定のこと
CREATE SERVER IF NOT EXISTS foreign2
FOREIGN DATA WRAPPER postgres_fdw OPTIONS
(host '192.168.1.143', port '5432', dbname 'fdw_test');
ALTER SERVER foreign1 OWNER TO test_user;
ALTER SERVER foreign2 OWNER TO test_user;
----------------------------------------------
-- server/ユーザマッピング作成
-- CREATEは一般ユーザで可能だが
-- password_required変更はrootしかできない
----------------------------------------------
CREATE USER MAPPING IF NOT EXISTS FOR test_user
SERVER foreign1
OPTIONS (user 'test_user', password 'test_pass');
CREATE USER MAPPING IF NOT EXISTS FOR test_user
SERVER foreign2
OPTIONS (user 'test_user', password 'test_pass');
ALTER USER MAPPING FOR test_user
SERVER foreign1
OPTIONS (ADD password_required 'false');
ALTER USER MAPPING FOR test_user
SERVER foreign2
OPTIONS (ADD password_required 'false');
SELECT * FROM pg_user_mappings;
EOT
#!/bin/bash
# UTF-8 LF
# setMainDB.sh
# このコマンドはtest_userで起動することを想定しています
# host 192.168.1.139,192.168.1.143 上のpostgreSQLに
# アクセスする記述となっていますので、実情に合わせ
# 変更する必要があります。
psql -U test_user --quiet -d fdw_test << EOT
DROP TABLE IF EXISTS 人物;
DROP TABLE IF EXISTS 施設;
CREATE TABLE IF NOT EXISTS 人物 (
id SERIAL NOT NULL PRIMARY KEY,
姓 varchar(256) NOT NULL,
名 varchar(256) NOT NULL,
補助情報 varchar(256) NULL
);
CREATE TABLE IF NOT EXISTS 施設 (
id integer NOT NULL PRIMARY KEY,
施設名 varchar(256) NOT NULL,
所在地 varchar(256) NOT NULL,
補助情報 varchar(256) NULL,
UNIQUE(施設名)
);
-- 人物データINSERT
DELETE FROM 人物;
INSERT INTO 人物 ( 姓,名 ) VALUES ( '山田','一郎' );
INSERT INTO 人物 ( 姓,名 ) VALUES ( '鈴木','次郎' );
INSERT INTO 人物 ( 姓,名 ) VALUES ( '山田','三郎' );
SELECT * FROM 人物;
-- 施設データINSERT
DELETE FROM 施設;
INSERT INTO 施設 ( id,施設名,所在地 ) VALUES ( 1,'施設-1','吉祥寺' );
INSERT INTO 施設 ( id,施設名,所在地 ) VALUES ( 2,'施設-2','渋谷' );
INSERT INTO 施設 ( id,施設名,所在地 ) VALUES ( 3,'施設-3','新宿' );
INSERT INTO 施設 ( id,施設名,所在地 ) VALUES ( 4,'施設-4','渋谷' );
SELECT * FROM 施設;
----------------------------------------------
-- TABLE(パーティション付き)作成
----------------------------------------------
DROP TABLE IF EXISTS 利用控え;
CREATE TABLE IF NOT EXISTS 利用控え (
id bigint NOT NULL,
人物id integer NOT NULL,
施設id integer NOT NULL,
利用日 date NULL
) PARTITION BY RANGE (施設id);
----------------------------------------------
-- 外部テーブル参照作成
----------------------------------------------
CREATE FOREIGN TABLE foreign_table_1
PARTITION OF 利用控え FOR VALUES FROM (1) TO (2)
SERVER foreign1 OPTIONS (schema_name 'public', table_name '利用控え');
CREATE FOREIGN TABLE foreign_table_2
PARTITION OF 利用控え FOR VALUES FROM (2) TO (5)
SERVER foreign2 OPTIONS (schema_name 'public', table_name '利用控え');
EOT
#!/bin/bash
# UTF-8 LF
# readFDW.sh
psql -U test_user --quiet -d fdw_test << EOT
-- 全レコード
SELECT 利用控え.id,
利用控え.人物id,人物.姓,人物.名,
利用控え.施設id,施設.所在地,施設.施設名 FROM 利用控え
JOIN 人物 ON 利用控え.人物id = 人物.id
JOIN 施設 ON 利用控え.施設id = 施設.id
;
--
SELECT MIN(利用控え.利用日) AS 利用開始日,MAX(利用控え.利用日) AS 最終利用日
FROM 利用控え
JOIN 人物 ON 利用控え.人物id = 人物.id
JOIN 施設 ON 利用控え.施設id = 施設.id
GROUP BY 施設.所在地,人物.姓,人物.名
HAVING 施設.所在地='渋谷' AND 人物.姓='鈴木' AND 人物.名='次郎';
EOT
#!/bin/bash
# UTF-8 LF
# setFDW_1.sh
# このコマンドはpostgresで起動することを想定しています
#============================================
# 基本設定
#============================================
psql -U postgres --quiet -d fdw_test<< EOT
DROP FOREIGN TABLE IF EXISTS 人物;
DROP FOREIGN TABLE IF EXISTS 施設;
--
DROP USER MAPPING IF EXISTS FOR test_user SERVER foreign1;
DROP SERVER IF EXISTS foreign1;
DROP EXTENSION IF EXISTS postgres_fdw ;
----------------------------------------------
-- postgres_fdw導入
----------------------------------------------
CREATE EXTENSION IF NOT EXISTS postgres_fdw ;
SELECT * FROM pg_extension;
----------------------------------------------
-- server作成
----------------------------------------------
-- hostは環境に合わせて設定のこと
CREATE SERVER IF NOT EXISTS foreign1
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '192.168.1.14', port '5432', dbname 'fdw_test');
ALTER SERVER foreign1 OWNER TO test_user;
----------------------------------------------
-- server/ユーザマッピング作成
----------------------------------------------
CREATE USER MAPPING IF NOT EXISTS FOR test_user
SERVER foreign1
OPTIONS (user 'test_user', password 'test_pass');
ALTER USER MAPPING FOR test_user
SERVER foreign1
OPTIONS (ADD password_required 'false');
SELECT * FROM pg_user_mappings;
EOT
#!/bin/bash
# UTF-8 LF
# setSubDB_1.sh
# このコマンドはtest_userで起動することを想定しています
psql -U test_user --quiet -d fdw_test << EOT
DROP TABLE IF EXISTS 利用控え;
--DROP FOREIGN TABLE IF EXISTS 人物;
--DROP FOREIGN TABLE IF EXISTS 施設;
----------------------------------------------
-- 外部テーブル参照作成
----------------------------------------------
CREATE FOREIGN TABLE 人物 (
id bigint NOT NULL,
姓 varchar(256) NOT NULL,
名 varchar(256) NOT NULL,
補助情報 varchar(256) NULL
)
SERVER foreign1
OPTIONS (schema_name 'public', table_name '人物');
CREATE FOREIGN TABLE 施設 (
id integer NOT NULL,
施設名 varchar(256) NOT NULL,
所在地 varchar(256) NOT NULL,
補助情報 varchar(256) NULL
)
SERVER foreign1
OPTIONS (schema_name 'public', table_name '施設');
----------------------------------------------
-- TABLE作成
----------------------------------------------
CREATE TABLE IF NOT EXISTS 利用控え (
id SERIAL NOT NULL PRIMARY KEY,
人物id integer NOT NULL,
施設id integer NOT NULL,
利用日 date NULL
);
INSERT INTO 利用控え ( 人物id,施設id,利用日 )
SELECT 人物.id,施設.id,'2021/08/13'
FROM 人物,施設
WHERE 人物.姓='山田' AND 人物.名='三郎' AND 施設.施設名='施設-1';
INSERT INTO 利用控え ( 人物id,施設id,利用日 )
SELECT 人物.id,施設.id,'2021/08/13'
FROM 人物,施設
WHERE 人物.姓='鈴木' AND 人物.名='次郎' AND 施設.施設名='施設-1';
INSERT INTO 利用控え ( 人物id,施設id,利用日 )
SELECT 人物.id,施設.id,'2021/08/16'
FROM 人物,施設
WHERE 人物.姓='山田' AND 人物.名='一郎' AND 施設.施設名='施設-1';
SELECT 利用控え.id,
利用控え.人物id,人物.姓,人物.名,
利用控え.施設id,施設.所在地,施設.施設名 FROM 利用控え
JOIN 人物 ON 利用控え.人物id = 人物.id
JOIN 施設 ON 利用控え.施設id = 施設.id
;
EOT
#!/bin/bash
# UTF-8 LF
# setFDW_2.sh
# このコマンドはpostgresで起動することを想定しています
#============================================
# 基本設定
#============================================
psql -U postgres --quiet -d fdw_test<< EOT
DROP FOREIGN TABLE IF EXISTS 人物;
DROP FOREIGN TABLE IF EXISTS 施設;
--
DROP USER MAPPING IF EXISTS FOR test_user SERVER foreign1;
DROP SERVER IF EXISTS foreign1;
DROP EXTENSION IF EXISTS postgres_fdw ;
----------------------------------------------
-- postgres_fdw導入
----------------------------------------------
CREATE EXTENSION IF NOT EXISTS postgres_fdw ;
SELECT * FROM pg_extension;
----------------------------------------------
-- server作成
----------------------------------------------
-- hostは環境に合わせて設定のこと
CREATE SERVER IF NOT EXISTS foreign1
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '192.168.1.14', port '5432', dbname 'fdw_test');
ALTER SERVER foreign1 OWNER TO test_user;
----------------------------------------------
-- server/ユーザマッピング作成
----------------------------------------------
CREATE USER MAPPING IF NOT EXISTS FOR test_user
SERVER foreign1
OPTIONS (user 'test_user', password 'test_pass');
ALTER USER MAPPING FOR test_user
SERVER foreign1
OPTIONS (ADD password_required 'false');
SELECT * FROM pg_user_mappings;
EOT
#!/bin/bash
# UTF-8 LF
# setSubDB_1.sh
# このコマンドはtest_userで起動することを想定しています
psql -U test_user --quiet -d fdw_test << EOT
DROP TABLE IF EXISTS 利用控え;
--DROP FOREIGN TABLE IF EXISTS 人物;
--DROP FOREIGN TABLE IF EXISTS 施設;
----------------------------------------------
-- 外部テーブル参照作成
----------------------------------------------
CREATE FOREIGN TABLE 人物 (
id bigint NOT NULL,
姓 varchar(256) NOT NULL,
名 varchar(256) NOT NULL,
補助情報 varchar(256) NULL
)
SERVER foreign1
OPTIONS (schema_name 'public', table_name '人物');
CREATE FOREIGN TABLE 施設 (
id integer NOT NULL,
施設名 varchar(256) NOT NULL,
所在地 varchar(256) NOT NULL,
補助情報 varchar(256) NULL
)
SERVER foreign1
OPTIONS (schema_name 'public', table_name '施設');
----------------------------------------------
-- TABLE作成
----------------------------------------------
CREATE TABLE IF NOT EXISTS 利用控え (
id SERIAL NOT NULL PRIMARY KEY,
人物id integer NOT NULL,
施設id integer NOT NULL,
利用日 date NULL
);
INSERT INTO 利用控え ( 人物id,施設id,利用日 )
SELECT 人物.id,施設.id,'2021/08/08'
FROM 人物,施設
WHERE 人物.姓='山田' AND 人物.名='一郎' AND 施設.施設名='施設-2';
INSERT INTO 利用控え ( 人物id,施設id,利用日 )
SELECT 人物.id,施設.id,'2021/08/09'
FROM 人物,施設
WHERE 人物.姓='鈴木' AND 人物.名='次郎' AND 施設.施設名='施設-2';
INSERT INTO 利用控え ( 人物id,施設id,利用日 )
SELECT 人物.id,施設.id,'2021/08/12'
FROM 人物,施設
WHERE 人物.姓='鈴木' AND 人物.名='次郎' AND 施設.施設名='施設-4';
INSERT INTO 利用控え ( 人物id,施設id,利用日 )
SELECT 人物.id,施設.id,'2021/08/15'
FROM 人物,施設
WHERE 人物.姓='鈴木' AND 人物.名='次郎' AND 施設.施設名='施設-4';
INSERT INTO 利用控え ( 人物id,施設id,利用日 )
SELECT 人物.id,施設.id,'2021/08/20'
FROM 人物,施設
WHERE 人物.姓='鈴木' AND 人物.名='次郎' AND 施設.施設名='施設-3';
SELECT 利用控え.id,
利用控え.人物id,人物.姓,人物.名,
利用控え.施設id,施設.所在地,施設.施設名 FROM 利用控え
JOIN 人物 ON 利用控え.人物id = 人物.id
JOIN 施設 ON 利用控え.施設id = 施設.id
;
EOT