- 締切済み
Postgresqlで配列に日付を格納したい
首記の件可能でしょうか? 可能であればSQL文等ご教示いただければ幸いです。 下記のようなテーブルを作成したいと考えています。 *訪問日だけを配列にしたい。訪問日は入力されどんどん増えていく。訪問日は年月日まで表示したい。 主キー;顧客番号 訪問日 [ ] よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- yamada59
- ベストアンサー率74% (29/39)
配列でもインデックスを使って検索できます。 CREATE TABLE test=> CREATE TABLE t (c int[]); CREATE TABLE test=> INSERT INTO t SELECT ARRAY[n] FROM generate_series(1, 100000) AS n; INSERT 0 100000 test=> EXPLAIN SELECT * FROM t WHERE c @> ARRAY[1]; QUERY PLAN ------------------------------------------------------- Seq Scan on t (cost=0.00..1986.00 rows=100 width=25) Filter: (c @> '{1}'::integer[]) (2 行) test=> CREATE INDEX t_c_idx ON t USING gin (c); CREATE INDEX test=> ANALYZE t; ANALYZE test=> EXPLAIN SELECT * FROM t WHERE c @> ARRAY[1]; QUERY PLAN ------------------------------------------------------------------------ Bitmap Heap Scan on t (cost=5.05..281.52 rows=100 width=25) Recheck Cond: (c @> '{1}'::integer[]) -> Bitmap Index Scan on t_c_idx (cost=0.00..5.03 rows=100 width=0) Index Cond: (c @> '{1}'::integer[]) (4 行)
- nora1962
- ベストアンサー率60% (431/717)
> どのようなマイナス面があるのかご教示いただけないでしょうか。 参照リンク先にもありますが、クライアント側ではこの機能を ほとんどサポートしていません。 また配列項目にはINDEX作成できないみたいなので、検索が遅く なる可能性が大きいです。 > 「(顧客番号+訪問日)を主キーして」という点は顧客番号、訪問日の両方を主キーにするという意味でしょうか? (顧客番号、訪問日)の複合キーで主キーにするという意味です。 create table 顧客訪問 ( 顧客番号 int, 訪問日 date, primary key (顧客番号,訪問日) ); のようにすれば作成できます。
- nora1962
- ベストアンサー率60% (431/717)
create table テーブル ( 顧客番号 int primary key, 訪問日 date[] ); insert into テーブル values ( 1, array[ cast('2010-1-1' as date), cast('2010-5-1' as date), cast('2010-11-1' as date) ]); insert into テーブル values ( 2, array[ cast('2011-1-1' as date), cast('2011-3-1' as date), cast('2011-6-1' as date) ] ); update テーブル set 訪問日 = ARRAY_APPEND( 訪問日, cast( '2010-9-1' as date ) ) where 顧客番号=1; update テーブル set 訪問日 = ARRAY_APPEND( 訪問日, cast( '2010-7-1' as date ) ) where 顧客番号=1; https://202.32.10.37/PostgreSQL/Manual/document/current/html/arrays.html https://202.32.10.37/PostgreSQL/Manual/document/current/html/functions-array.html 出来ますけれど、失うものの方が大きいと思います。 なぜ、 顧客番号 訪問日 で(顧客番号+訪問日)を主キーして、訪問日にINDEXを貼るのではダメですか?
お礼
回答ありがとうございます。下記の点重ねてご教示願えないでしょうか。 <出来ますけれど、失うものの方が大きいと思います。 どのようなマイナス面があるのかご教示いただけないでしょうか。 <顧客番号 訪問日 で(顧客番号+訪問日)を主キーして、訪問日にINDEXを貼るのではダメですか? 「(顧客番号+訪問日)を主キーして」という点は顧客番号、訪問日の両方を主キーにするという意味でしょうか? よろしくお願いいたします。