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

PostgreSQLのすべてのバージョン。そのコンテキストが重要な場合は、postgresql-11などのバージョン固有のタグを追加します。

2
PostgresのJOIN条件とWHERE条件
Postgres初心者はこちら。 このクエリが最適化されているかどうか疑問に思っていますか?100%必要な値だけを結合し、すべての動的条件をWHERE句に残そうとしました。下記参照。 SELECT * FROM myapp_employees JOIN myapp_users ON myapp_users.user_id=myapp_employees.user_id JOIN myapp_contacts_assoc ON myapp_contacts_assoc.user_id=myapp_users.user_id JOIN myapp_contacts ON myapp_contacts.contact_id=myapp_contacts_assoc.contact_id WHERE myapp_contacts.value='test@gmail.com' AND myapp_contacts.type=(1)::INT2 AND myapp_contacts.is_primary=(1)::INT2 AND myapp_contacts.expired_at IS NULL AND myapp_employees.status=(1)::INT2 AND myapp_users.status=(1)::INT2 LIMIT 1; 注:コンテキストについては、このプロシージャはユーザーが従業員でもあるかどうかを確認しています(昇格された特権/別のユーザータイプ)。 とにかく、これは正しい方法ですか?たとえば、JOIN ONには、expired_at IS NULLのチェックなど、より多くのステートメントを含める必要がありますか?なぜ、またはなぜこれが意味をなさないのですか?

2
psql:致命的:ユーザーのピア認証に失敗しました
Ubuntu 15.10にPostgreSQL 9.4をインストールしました。 私はユーザーを作成しました createuser -P myuser 私はデータベースを作成しました createdb -O myuser mydatabase 編集pg_hba.confして追加しましたlocal mydatabase myuser md5 私はPostgreSQLを再起動しました sudo service postgresql restart ユーザーmyuserはPostgresSQLユーザーのみで、Ubuntuにはユーザーアカウントがありません。 でデータベースに接続しようとすると、psql -W mydatabase myuserで失敗しpsql: FATAL: Peer authentication failed for user "myuser"ます。 PostgreSQLが実行中… ● postgresql.service - PostgreSQL RDBMS Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled) Active: active (exited) since …

2
多くの列といくつかのテーブル-パフォーマンスの面で
はい、私はデータの正規化が(現状のまま)私の優先事項であることを認識しています。 私は列の車両データを格納する65個の列を持つテーブルを持っている:used_vehicle、color、doors、mileage、priceなど、合計65インチ 今、私はそれを分割して持つことができるVehicleテーブル、VehicleInterior、VehicleExterior、VehicleTechnical、VehicleExtra(すべての一対一のメインとVehicleテーブル)。 約500万行(車両)があるとします。 上SELECTでのWHERE句:パフォーマンスが(どちらの場合は、上の少なくともインデックスを付けて検索するほうが良いでしょうIDs): Vehicle 65列のテーブルまたは VehicleテーブルJOINSに関連するすべてのデータを返すために、他の4つのテーブル(すべてで5万行)にVehicle? (データベースエンジンごとに、PostgreSQLやMySQLを検討してください)。 以前の経験から得られた詳細な洞察を本当に感謝しますか?

2
PostgreSQL-挿入/更新が外部キー制約に違反しています
私はpostgreSQLの新人です。3つのテーブルがあり、1つのテーブルが他の2つのテーブルの主キーを参照しています。しかし、データをに挿入できませんでしたTable3。以下のコードを参照してください: DROP TABLE Table1 CASCADE; CREATE TABLE Table1( "DataID" bigint NOT NULL DEFAULT '0', "AdData" integer DEFAULT NULL, PRIMARY KEY ("DataID") ); DROP TABLE IF EXISTS Table2 CASCADE; CREATE TABLE Table2 ( "Address" numeric(20) NOT NULL DEFAULT '0', "Value" numeric(20) DEFAULT NULL, PRIMARY KEY ("Address") ); DROP TABLE IF EXISTS …

2
SELECTとWHERE句で同じ関数
初心者向けの質問: f(x, y)データベーステーブルの2つの列xとyに高価な関数があります。 関数の結果を列として与え、それに制約を課すようなクエリを実行したいのですが、 SELECT *, f(x, y) AS func FROM table_name WHERE func < 10; しかしこれはうまくいかないので、私は次のようなものを書かなければなりません SELECT *, f(x, y) AS func FROM table_name WHERE f(x, y) < 10; これは高価な関数を2回実行しますか?これを行う最良の方法は何ですか?

1
タイムスタンプでパーティション化されたテーブルを含む結合には、パーティション制約は使用されません
次のような分割テーブル構造があります。 CREATE TABLE measurements ( sensor_id bigint, tx timestamp, measurement int ); CREATE TABLE measurements_201201( CHECK (tx >= '2012-01-01 00:00:00'::timestamp without time zone AND tx < ('2012-01-01 00:00:00'::timestamp without time zone + '1 mon'::interval)) )INHERITS (measurements); CREATE INDEX ON measurements_201201(sensor_id); CREATE INDEX ON measurements_201201(tx); CREATE INDEX ON measurements_201201(sensor_id, tx); .... …

1
SQL仕様ではEXISTS()にGROUP BYが必要ですか?
マイクロソフトでは現在、この構文を許可しています。 SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS ( SELECT * FROM ( VALUES (1),(1) ) AS t(x) WHERE g.x = t.x HAVING count(*) > 1 ); ノーがあることに注意してくださいGROUP BYにEXISTS句は、その有効なANSI SQLです。それとも単に実装の詳細を公開するだけなのでしょうか。 参考までに、これと同じ構文はPostgreSQLでは許可されていません。 エラー:列 "tx"はGROUP BY句に出現するか、集計関数で使用する必要があります しかし、この構文は許可されています。 SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS …

10
標準SQLまたはT-SQLで1、2、3、3、2、1、1、2、3、3、2、1、…シリーズを生成する方法は?
二つの数を考えるnとm、私は、フォームのシリーズを生成したいです 1, 2, ..., (n-1), n, n, (n-1), ... 2, 1 そしてそれを繰り返しmます。 たとえば、n = 3およびの場合、m = 4次の24個の数字のシーケンスが必要です。 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1 ---------------- ---------------- ---------------- ---------------- PostgreSQLでこの結果を2つの方法のいずれかで達成する方法を知っています。 generate_series関数を使用する次のクエリと、順序が正しいことを保証するためのいくつかのトリックを使用します。 WITH parameters (n, …

2
PostgreSQL:関数の引数としてテーブルを渡します
TYPEPostgreSQLで発見しています。私はTABLE TYPEいくつかのテーブルが尊重しなければならないことを持っています(インターフェース)。例えば: CREATE TYPE dataset AS( ChannelId INTEGER ,GranulityIdIn INTEGER ,GranulityId INTEGER ,TimeValue TIMESTAMP ,FloatValue FLOAT ,Status BIGINT ,QualityCodeId INTEGER ,DataArray FLOAT[] ,DataCount BIGINT ,Performance FLOAT ,StepCount INTEGER ,TableRegClass regclass ,Tags TEXT[] ,WeightedMean FLOAT ,MeanData FLOAT ,StdData FLOAT ,MinData FLOAT ,MaxData FLOAT ,MedianData FLOAT ,Percentiles FLOAT[] ); このテンプレートを使用してテーブルを作成できます: CREATE TABLE …

1
大量のデータを含む既存のテーブルにインデックスを追加するとどうなりますか?
約1500万件のレコードを含むテーブルがあります。次に、テーブルにインデックスを追加する必要があります。 インデックスを追加すると、テーブルのすべてのエントリが更新されるまでに時間がかかります。 インデックスを追加するとダウンタイムが発生するかどうか、私はかなり混乱しています。 はいの場合、どのようにしてダウンタイムを克服できますか?

1
型修飾子を使用したデータ型の驚くべき結果
この質問に対する再帰的なCTEソリューションについて説明しながら: 各IDの最後の5つの異なる値を取得する @ypercubeは驚くべき例外に出くわし、型修飾子の処理を調査することになりました。私たちは驚くべき行動を見つけました。 1.型キャストは、一部のコンテキストで型修飾子を保持します しないように指示された場合でも。最も基本的な例: SELECT 'vc8'::varchar(8)::varchar 一つは、期待していないかもしれないvarchar私は、少なくとも、(無修正)でしょう。しかし、結果はvarchar(8)(修飾子付き)です。以下のフィドルで関連する多くのケース。 2.配列の連結により、一部のコンテキストで型修飾子が失われる 必要がないので、これは反対側でエラーになります: SELECT ARRAY['vc8']::varchar(8)[] , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8) 最初の式はvarchar(8)[]期待どおりに生成されます。 しかし、2番目は、連結した後、別のものvarchar(8)がvarchar[]修正されます(修飾子なし)。からの同様の動作、array_append()以下のフィドルの例。 このすべては、ほとんどの状況で重要ではありません。Postgresはデータを失わず、列に割り当てられると、値はとにかく正しい型に強制されます。ただし、反対方向にエラーを発生させると、驚くべき例外が発生します。 3.再帰的なCTEは、完全に一致するデータ型を要求します この単純化されたテーブルを考えると: CREATE TABLE a ( vc8 varchar(8) -- with modifier , vc varchar -- without ); INSERT INTO a VALUES ('a', 'a'), ('bb', 'bb'); このrCTEはvarchar列に対しては機能しvcますが、varchar(8)列に対しては失敗しますvc8。 WITH RECURSIVE cte AS ( …


1
PostgresでのUPDATE / INSERTの組み合わせのロック
テーブルが2つあります。1つはログテーブルです。もう1つには、基本的に1回しか使用できないクーポンコードが含まれています。 ユーザーはクーポンを利用できる必要があります。これにより、ログテーブルに行が挿入され、クーポンが使用済みとしてマークされます(used列をに更新することによりtrue)。 もちろん、ここには明らかな競合状態/セキュリティ問題があります。 私は過去にもmySQLの世界で同様のことをしたことがあります。その世界では、両方のテーブルをグローバルにロックし、これは一度に1回だけ発生する可能性があるという知識のもとでロジックを安全に実行し、完了したらテーブルのロックを解除します。 Postgresでこれを行うより良い方法はありますか?特に、ロックがグローバルであることを心配していますが、グローバルである必要はありません。他の誰かがその特定のコードを入力しようとしていないことを確認するだけでよいので、行レベルのロックが機能するでしょうか?

2
UPDATE CASCADEを使用したFK制約によって操作が発生した場合、FOR EACH STATEMENTトリガーはどのくらいの頻度で実行されますか?
で定義されたテーブルtのトリガーは、FOR EACH STATEMENTを実行すると1回実行されることを理解していますUPDATE t ...。 では、をtで定義しFOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE、でN行を更新aすると、トリガーが1回呼び出されるのですか、それともN回呼び出されるのですか? 別の言い方をすると、FK制約によってカスケードされたテーブルへの変更は、単一のUPDATE、または一連のUPDATEのようなものですか?

2
PL / pgSQLで手動で発生した例外の例外コンテキストを取得するにはどうすればよいですか?
Postgresでは、次のコードを使用して例外の「スタックトレース」を取得します。 EXCEPTION WHEN others THEN GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT; これは「自然な」例外では問題なく機能しますが、 RAISE EXCEPTION 'This is an error!'; ...その後、スタックトレースはありません。メーリングリストのエントリによると、これは意図的なものである可能性がありますが、私の人生では理由を理解することはできません。を使用する以外の例外をスローする別の方法を理解したいと思いRAISEます。私は明らかな何かを見逃しているだけですか?誰かがこれのためのトリックを持っていますか?私の選択した文字列を含むPostgresをスローできる例外はありますか?そのため、エラーメッセージで私の文字列だけでなく、完全なスタックトレースも取得しますか? ここに完全な例があります: CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$ DECLARE v_error_stack text; BEGIN -- Comment this out to see how a "normal" exception will give you the stack trace RAISE …

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