タグ付けされた質問 「postgresql-9.5」

特にPostgreSQLバージョン9.5の場合

1
PostgreSQL DELETE FROMが「エラー:不可視のタプルを削除しようとしました」で失敗します
この質問は、データベース管理者のStack Exchangeで回答できるため、Server Faultから移行されました。 2年前に移行され ました。 エラー 無効なタイムスタンプを含むタプルを削除しようとしています DELETE FROM comments WHERE date > '1 Jan 9999' OR date < '1 Jan 2000' OR date_found > '1 Jan 9999' OR date_found < '1 Jan 2000'; で終わる ERROR: attempted to delete invisible tuple 2009年には、OPで修正されたまったく同じエラーメッセージについて議論するメーリングリストがありますが、彼がそれをどのようにしたのか、またはこのエラーにつながったのかについての説明はありません。 Googleでヒットがなく、PostgreSQLの知識が限られているため、私は無力です。 腐敗の原因 OSカーネルがパニックになったときに、おそらくスワップが配置されている/ dev / md1を再構築しているときに、Debian 8で実行しているPostgreSQL 9.5.5サーバー(メモリ制限の上限を除くすべてのデフォルト設定)を実行しました。それ以前は、PostgreSQLは400GBのログファイルでほとんどすべてのディスク領域を使い果たしました。OSは二度と起動しなかったので、ディスクチェックは問題ありませんでした。念のため、LiveCDから起動し、各ブロックデバイスをイメージにバックアップしました。/ …

2
upsertで競合する行のIDを取得する方法は?
tag2つの列を持つテーブルがあります:id(uuid)とname(text)。テーブルに新しいタグを挿入したいのですが、タグが既に存在する場合idは、既存のレコードを取得するだけです。 私はちょうどON CONFLICT DO NOTHINGと組み合わせて使用できると仮定しましたRETURNING "id": INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT DO NOTHING RETURNING "id"; ただし、「foo」という名前のタグがすでに存在する場合、これは空の結果セットを返します。 次に、noop DO UPDATE句を使用するようにクエリを変更しました。 INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT ("name") DO UPDATE SET "name" = 'foo' RETURNING "id"; これは意図したとおりに機能しますが、名前を既存の値に設定しているだけなので、やや混乱します。 これはこの問題を解決する方法ですか、それとも私が見逃しているより簡単なアプローチがありますか?

1
Postgres:SET NOT NULLはCHECK制約よりも「効率的」です
では制約のためのPostgreSQLのドキュメント、それは言います 非ヌル制約は、機能的にチェック制約の作成と同等ですCHECK (column_name IS NOT NULL)が、PostgreSQLでは明示的な非ヌル制約の作成がより効率的です。 不思議なんだけど 「より効率的」とはどういう意味ですか? のCHECK (column_name IS NOT NULL)代わりに使用することの欠点は何SET NOT NULLですか? NOT VALID CHECK制約を追加して個別に検証できるようにしたい(したがって、制約の追加のAccessExclusiveLockために短時間だけ保持され、その後ShareUpdateExclusiveLock、より長い検証手順のために保持される): ALTER TABLE table_name ADD CONSTRAINT column_constraint CHECK (column_name IS NOT NULL) NOT VALID; ALTER TABLE table_name VALIDATE CONSTRAINT column_constraint; の代わりに: ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;


1
Postgresの0001年のタイムゾーンに、UTCからのこのようなクレイジーなオフセットがあるのはなぜですか?
Postgres 9.5では、年0001(ゼロ0000年なし)を試しているときに以下の結果が表示されたことに驚きました。 のオフセット-07:52:58? いくつかのサンプルコード。Iの混合使用することを注意TIMESTAMP WITH TIME ZONEしてTIMESTAMP WITHOUT TIME ZONE、慎重に読んでください。 SET TIME ZONE 'America/Los_Angeles' ; SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0', TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ; ("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00") 私はその2番目の値に驚いています0001-12-31 16:07:02-07:52:58 BC。America/Los_AngelesUTCから8時間遅れているのと同じように、オフセットを8時間戻し-08:00ます。しかし-08:00、オフセットの代わりにです-07:52:58。どうして? UTCで問題なし UTCでデータを入力する場合、このような問題はありません。 SET TIME ZONE 'UTC' ; …

1
postgresql.confファイルの「max_wal_size」および「min_wal_size」パラメーターのデフォルト値を理解する
デフォルト値は、ドキュメントmin_wal_sizeおよびmax_wal_sizeパラメータによると: For max_wal_size:The default is 1 GB For min_wal_size:The default is 80 MB 次に、データベース構成から次のパラメーターを探します。 select name, setting, unit from pg_settings where name in ('min_wal_size', 'max_wal_size') 結果を与える: name | setting | unit ---------------------------------- max_wal_size | 64 | min_wal_size | 5 | 2つの質問があります。 1)これらの値がドキュメントに示されているデフォルト値と一致しないのはなぜですか?構成設定をまったく変更しませんでした。 2)unitこれらのパラメーターの列が空/ NULLである理由 この場合、64と5の値はどういう意味ですか?MB?GB?または何? work_memすべてが明確な場合、これがパラメーターの例とは異なる理由 : name | setting …

1
psql 9.5:gen_random_uuid()が機能しない
SELECT gen_random_uuid() 出力を生成します ERROR: function gen_random_uuid() does not exist SQL state: 42883 Hint: No function matches the given name and argument types. You might need to add explicit type casts. 私は走ったCREATE EXTENSION pgcrypto;、選択したデータベースにしてSELECT gen_random_bytes(1)(完全に動作しgen_random_bytes、他のデータベースでは動作しませんpgcrypto拡張子が手動で作成されていません)。 % psql --version psql (PostgreSQL) 9.5.3 Ubuntuバージョンは16.04です。

1
PostgreSQLでのJSONBのクエリ
私は、テーブルを持つpersons2つの列が含まれている、idとJSONBベースのdata列を(この表は単なるPostgreSQLのJSONサポートで遊んする実演目的のために作られました)。 ここで、2つのレコードが含まれていると想定します。 1, { name: 'John', age: 30 } 2, { name: 'Jane', age: 20 } ここで、25歳以上のすべての人の名前を取得したいとします。私が試したのは次のとおりです。 select data->'name' as name from persons where data->'age' > 25 残念ながら、これはエラーになります。の->>代わりにを使用して解決でき->ますが、数値は比較されないため、比較は期待どおりに機能しなくなりますが、文字列としての表現: select data->'name' as name from persons where data->>'age' > '25' 次に、を使用->してキャストすることで問題を実際に解決できることがわかりましたint: select data->'name' as name from persons where cast(data->'age' as int) > …

4
Postgresデータベースのすべてのデータを削除する
--data-onlyand --column-insertsフラグを使用して本番サーバーから新しいdbダンプを作成したので、ステージングサーバーで復元を実行するときにデータを挿入するための挿入ステートメントの束しかありません。 pg_dump -h localhost -U adminuser --data-only --column-inserts maindb > maindb.sql 本番ダンプからデータを復元する前に、ステージングサーバーデータベースのすべてのデータを最初に削除するにはどうすればよいですか? すべてのデータのみを削除したいので、データベースやそのすべてのものを削除して作成する必要はありません。データを削除して、新しいデータをすべて挿入したいだけです。 いくつかの理由により、データベースを削除して作成するオプションがありません。私はすべてのデータを削除して挿入するだけでよいので、これを行う方法を見つけるために必要なことは何でも、進んで進んでいきますが、最初から手助けが必要です。 このプロセスも自動化する必要があります。「本番データベースからのデータのダンプ」、「ステージングデータベースのデータの削除」、「ステージングデータベースへのデータの復元」を自動化します。「ステージングデータベースのデータの削除」の部分で助けが必要です。 PostgreSQL 9.5.2で実行しています

2
NULL値に関するPostgreSQL UPSERTの問題
Postgres 9.5の新しいUPSERT機能の使用に問題があります 別のテーブルからデータを集計するために使用されるテーブルがあります。複合キーは20列で構成され、そのうち10列はNULL可能です。以下に、特にNULL値を使用して、私が抱えている問題のより小さなバージョンを作成しました。 CREATE TABLE public.test_upsert ( upsert_id serial, name character varying(32) NOT NULL, status integer NOT NULL, test_field text, identifier character varying(255), count integer, CONSTRAINT upsert_id_pkey PRIMARY KEY (upsert_id), CONSTRAINT test_upsert_name_status_test_field_key UNIQUE (name, status, test_field) ); このクエリの実行は、必要に応じて機能します(最初の挿入、その後の挿入は単純にカウントを増やします)。 INSERT INTO test_upsert as tu(name,status,test_field,identifier, count) VALUES ('shaun',1,'test value','ident', 1) ON CONFLICT …

1
PostgreSQL 9.5は、Windows 10の秋の更新後に起動しません
Windows 10 Fallアップデート(1709)をインストールしましたが、PostgreSQL 9.5サーバーが起動しなくなりました。更新前の昨日は機能していましたが、構成を変更していません。 イベントビューアを確認しましたが、次のエラーメッセージが見つかりました。 2017-10-19 11:32:32 CEST LOG: invalid value for parameter "lc_monetary": "Czech_Czech Republic.1250" 2017-10-19 11:32:32 CEST LOG: invalid value for parameter "lc_numeric": "Czech_Czech Republic.1250" 2017-10-19 11:32:32 CEST LOG: invalid value for parameter "lc_time": "Czech_Czech Republic.1250" 2017-10-19 11:32:32 CEST FATAL: configuration file "C:/Program Files/PostgreSQL/9.5/data/postgresql.conf" contains errors MicrosoftはFallアップデートでロケール名を変更したようです。利用可能なロケール名のリストが見つからなかったため、Postgres 10をインストールすることに決め、疑いを確認しました、Postgres …

2
制約-1つのブール行はtrue、他のすべての行はfalse
列があります: standard BOOLEAN NOT NULL 1つの行をTrueに、その他の行をすべてFalseに強制したいと思います。この制約に応じて、FKやその他のものはありません。私はplpgsqlでそれを達成できることを知っていますが、これは大槌のようです。CHECKまたはUNIQUE制約のようなものを好みます。シンプルなほど良い。 1つの行はTrueでなければなりませんが、すべてFalseにすることはできません(したがって、最初に挿入された行はTrueである必要があります)。 行を更新する必要があります。つまり、すべての行が最初にFalseに設定され、その後に1つの行がTrueに設定される可能性があるため、更新が完了するまで制約を確認するのを待つ必要があります。 そこの間にFKがあるproducts.tax_rate_idとtax_rate.id、それはデフォルトまたは新製品を作成する容易にするために、ユーザが選択可能で、標準税率、とは何の関係もありません。.. 重要な場合はPostgreSQL 9.5。 バックグラウンド 表は税率です。税率の1つがデフォルトです(standardデフォルトはPostgresコマンドであるため)。新しい商品が追加されると、標準の税率が商品に適用されます。がないstandard場合、データベースは推測またはすべての種類の不要なチェックを実行する必要があります。簡単な解決策は、があることを確認することだと思いましたstandard。 上記の「デフォルト」とは、プレゼンテーション層(UI)を意味します。デフォルトの税率を変更するためのユーザーオプションがあります。GUI /ユーザーがtax_rate_idをNULLに設定しないようにするために追加のチェックを追加するか、デフォルトの税率を設定する必要があります。

1
postgres_fdwのパフォーマンスが遅い
外部に対する次のクエリは、320万行で実行するのに約5秒かかります。 SELECT x."IncidentTypeCode", COUNT(x."IncidentTypeCode") FROM "IntterraNearRealTimeUnitReflexes300sForeign" x WHERE x."IncidentDateTime" >= '05/01/2016' GROUP BY x."IncidentTypeCode" ORDER BY 1; 通常のテーブルで同じクエリを実行すると、.6秒で戻ります。実行計画はまったく異なります。 通常のテーブル Sort (cost=226861.20..226861.21 rows=4 width=4) (actual time=646.447..646.448 rows=7 loops=1) Sort Key: "IncidentTypeCode" Sort Method: quicksort Memory: 25kB -> HashAggregate (cost=226861.12..226861.16 rows=4 width=4) (actual time=646.433..646.434 rows=7 loops=1) Group Key: "IncidentTypeCode" -> Bitmap Heap …

1
トランザクションIDラップアラウンド後にxminとtxid_current()を比較する方法は?
通常の列に加えて、Postgresテーブルにはさまざまなシステム列があります。そのうちの1つはxmin、行の作成に使用されるトランザクションIDを格納します。そのデータ型はxid、ある時点で折り返す4バイトの整数です(つまり、必ずしも一意ではありません)。この関数txid_current()は、現在のトランザクションIDを返しますbigintが、「インストール中にラップしないように「エポック」カウンターで拡張されるため」として、マニュアルを引用します。 トランザクションのラップアラウンドがまだ発生していない場合、両方の値が一致しているようです: # CREATE TABLE test (label text); CREATE TABLE # INSERT INTO test VALUES ('test') RETURNING txid_current(); txid_current -------------- 674500 (1 row) INSERT 0 1 # SELECT xmin FROM test; xmin -------- 674500 (1 row) しかし、私は疑問に思う:これらの2つの値は常に同等ですか?私の知る限り、txid_current()トランザクションIDのラップアラウンド(最大2 ^ 32トランザクション)後も一意の値を配信し続けxmin、ゼロから開始します。これは、両方がその時点で異なる値を返し始めることを意味しますか? そして、これが当てはまる場合xid、txid_current()結果を規則的に抽出xminして、テーブル内のエントリと一致するようにする方法はありますか(たとえばtxid_current()、整数へのキャスト)。 編集:トランザクションIDのラップアラウンドの後、2 ^ 32トランザクションのかなり前に起こる可能性が非常に高いことを気にかけていることを明確にします。コメントでこれを指摘してくれたDanielVéritéに感謝します。

3
PL / pgSQLで複数行のレコードを返す方法
私はRECORDデータ型を使用して複数のレコードを返そうとしていますが、RECORDに追加し、このRECORDに反復するたびに新しい値を追加/追加する方法があります。 つまり、ループが終了すると行のセットになるrecように追加したいrecと思います。これは、関数の最後で単に返すことができます。現在、私はこれをやっています- SELECT temp_table.col1, temp_table.col2, temp_table.col3 INTO rec FROM temp_table WHERE temp_table.col3 = false; 私の完全なコードはここにあります: CREATE OR REPLACE FUNCTION validation() RETURNS RECORD AS $$ DECLARE rec RECORD; temp_row RECORD; BEGIN CREATE TEMPORARY TABLE temp_table (col1 TEXT, col2 INTEGER, col3 BOOLEAN) ON COMMIT DROP; FOR temp_row IN SELECT * FROM staging.validation …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.