SERIAL
主キーを使用するPostgreSQLテーブルは、PostgreSQLによって作成される暗黙のインデックス、シーケンス、および制約で終わることを知っています。問題は、テーブルの名前が変更されたときに、これらの暗黙的なオブジェクトの名前を変更する方法です。以下は、最後に特定の質問をしてこれを理解しようとする私の試みです。
次のようなテーブルがあるとします。
CREATE TABLE foo (
pkey SERIAL PRIMARY KEY,
value INTEGER
);
Postgresの出力:
注意:CREATE TABLEは、シリアル列「foo.pkey」に対して暗黙のシーケンス「foo_pkey_seq」を作成します。
注意:CREATE TABLE / PRIMARY KEYは、テーブル「foo」に対して暗黙のインデックス「foo_pkey」を作成します。
クエリは52ミリ秒で正常に返されました。
pgAdmin III SQLペインには、テーブルの次のDDLスクリプトが表示されます(デクラッタリング)。
CREATE TABLE foo (
pkey serial NOT NULL,
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE foo OWNER TO postgres;
次に、テーブルの名前を変更します。
ALTER table foo RENAME TO bar;
クエリは正常に返され、17ミリ秒で結果が得られませんでした。
pgAdmin III:
CREATE TABLE bar (
pkey integer NOT NULL DEFAULT nextval('foo_pkey_seq'::regclass),
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE bar OWNER TO postgres;
余分なことに注意してください。 DEFAULT nextval('foo_pkey_seq'::regclass),
これは、テーブルの名前を変更しても主キーのシーケンスの名前が変更されないことを意味しますが、これで明示的になりnextval()
ます。
次に、シーケンスの名前を変更します。
データベースの名前の一貫性を保ちたいので、次のことを試しました。
ALTER SEQUENCE foo_pkey_seq RENAME TO bar_pkey_seq;
クエリは正常に返され、17ミリ秒で結果が得られませんでした。
pgAdmin III:
CREATE TABLE bar (
pkey serial NOT NULL,
value integer,
CONSTRAINT foo_pkey PRIMARY KEY (pkey )
);
ALTER TABLE bar OWNER TO postgres;
DEFAULT nextval('foo_pkey_seq'::regclass),
なくなった。
質問
- なぜ
DEFAULT nextval('foo_pkey_seq'::regclass)
ステートメントが表示されたり消えたりしたのですか? - テーブルの名前を変更すると同時に、主キーシーケンスの名前を変更する方法はありますか?
- クライアントがデータベースに接続しているときにテーブルの名前を変更してからシーケンスを実行しても安全ですか?同時実行の問題はありますか?
- postgresはどのシーケンスを使用するかをどのように知るのですか?内部で使用されているデータベーストリガーはありますか?テーブルとシーケンス以外に名前を変更するものはありますか?
- 主キーによって作成された暗黙のインデックスはどうですか?名前を変更する必要がありますか?もしそうなら、それはどのように行うことができますか?
- 上記の制約名はどうですか?まだ
foo_pkey
です。制約の名前はどのように変更されますか?