私はPostgreSQLに入院患者のテーブルがあり、そのプライマリキーをPAT0000001
(char varying
)として作成し、そのフィールドをauto-incrementとして保持したい。
これを達成する方法はありますか?
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
のようなコードを表示します。ユーザーは、整数を格納しているだけであることを知る必要はありません。
PAT
、DOC
などの他の接頭辞が必要な場合は、複合主キーを使用します。
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)
に変換してクエリを実行し、それを逆にしてユーザーに表示します。
representationとstorageの要件が混在しています。これは、通常は両方を同時に実行するスプレッドシートプログラムを使用する人にとってはよくある誤解です。
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
のドップイン置換として使用するか、式のみを使用します。