web-dev-qa-db-ja.com

いくつかの文字が前に付いた列を変化させる自動インクリメント文字

私はPostgreSQLに入院患者のテーブルがあり、そのプライマリキーをPAT0000001char varying)として作成し、そのフィールドをauto-incrementとして保持したい。

これを達成する方法はありますか?

4
itsME

PostgreSQLには、MySQLのAUTO_INCREMENTの意味で「自動インクリメント」フィールドはありませんが、SERIALを意味していると思います。

もしそうなら、はい、あなたが説明したことは可能ですが、しないでください。

SERIALは、CREATE SEQUENCEおよびデフォルト値の省略形です。例えば.

CREATE TABLE blah(
   id serial primary key
);

実際の省略形です:

CREATE SEQUENCE blah_id_seq;

CREATE TABLE blah (
    id integer primary key default nextval('blah_id_seq'::regclass)
);

ALTER SEQUENCE blah_id_seq OWNED BY blah.id;

この知識を使用して、nextvalリターンを文字タイプにキャストできます。

CREATE TABLE thisiswrong (
    id text primary key default CAST(nextval('thisiswrong_id_seq'::regclass) AS text)
);

繰り返しますが、私はあなたに懇願しますこれを行わないでください。ひどいです。それは間違っています。あなたはそれを後悔するでしょう。 あなたがやろうとしていることは何でも、これより良い方法があります

PAT000001のようなフォーマットされたフィールドを生成する方法を意図的にではなく示しましたが、anyを使用できます単なるDEFAULTではなくCASTのexpression。したがって、主張する場合の方法については、to_char関数またはformat関数を参照してください。

正しいあなたがやりたいことをする方法はそれをしないことです)。 applicationを取得して、PAT000001のようなpatient_idの主キー値が見つかったときに、1のようなコードを表示します。ユーザーは、整数を格納しているだけであることを知る必要はありません。

PATDOCなどの他の接頭辞が必要な場合は、複合主キーを使用します。

CREATE TABLE saner_ish (
    categorycode varchar(3) CHECK (length(categorycode) = 3),
    patient_id integer default nextval('saner_ish_patient_id'::regclass),
    PRIMARY KEY (categorycode, patient_id)
);

(おそらくenumタイプ、INリスト、または検証用の何でも)。

次に、アプリケーションでPAT00001('PAT', 1)に変換してクエリを実行し、それを逆にしてユーザーに表示します。

6
Craig Ringer

representationstorageの要件が混在しています。これは、通常は両方を同時に実行するスプレッドシートプログラムを使用する人にとってはよくある誤解です。

serial 列を格納するだけです。基になるinteger列は4バイトを占め、DBのさまざまな目的で非常に効率的です。比較すると、「-PAT0000001」は textまたはvarchar として11バイトを占め、照合の対象となり、全体としてはそれほど効率的ではありません。

複数列の主キーは必要ないようです。 不要な複雑化になります。患者のさまざまな「タイプ」が必要な場合でも、単純な単一列サロゲート主キーを使用します。

_CREATE TABLE patient (
   patient_id serial PRIMARY KEY
 , col1 text NOT NULL
 , col2 date NOT NULL
   ... -- more columns
);
_

presentationニーズの場合、作成する view

_CREATE VIEW patient_pretty AS
SELECT to_char(1, '"PAT"FM0000000') AS patient_code, col1, col2
FROM   patient;
_

混乱を避けるために、フォーマットされたIDには一貫して異なる列名を使用することをお勧めします。私の例では_patient_code_です。

to_char() 式は、ここで少しトリッキーなことだけです。 FM修飾子に注意して、先頭の空白(負の記号の可能性があるプレースホルダー)を避けてください。

これで、きれいに表示したい場合は、ビュー_patient_pretty_をテーブルpatientのドップイン置換として使用するか、式のみを使用します。

3