MySQLのテーブル定義をPostgreSQL用に書き換える例
問題
MySQLにはAUTO_INCREMENTで連番が取れたりするけど、PostgreSQLにはないですよね。
MySQLのテーブル定義をPostgreSQL用に書き換えたりできますか?
答え
連番が欲しかったら、シーケンス。
長いけど仕組みがわかりやすいように書いたらこんな感じでしょうか。
/* MySQLの場合 */
CREATE TABLE t_test (
t_test_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
api_access_key varchar(100) NOT NULL,
api_secret_key varchar(200) NOT NULL,
enable tinyint NOT NULL,
del_flg tinyint NOT NULL,
create_date timestamp NOT NULL,
update_date timestamp NOT NULL
);
/* PostgreSQLの場合 */
CREATE SEQUENCE t_test_id_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
CREATE TABLE t_test (
t_test_id integer DEFAULT nextval('t_test_id_seq') NOT NULL,
api_access_key text NOT NULL,
api_secret_key text NOT NULL,
enable smallint DEFAULT 0 NOT NULL,
del_flg smallint DEFAULT 0 NOT NULL,
create_date timestamp without time zone DEFAULT now() NOT NULL,
update_date timestamp without time zone NOT NULL
);
ALTER TABLE ONLY t_test
ADD CONSTRAINT t_test_pkey PRIMARY KEY (t_test_id);
PostgreSQLの場合、連番用のシーケンスを作って、
連番の方は、指定されなかったらシーケンスから値を取って来てもらうようにする。
PostgreSQLでも連番を勝手に取らせる仕組みはある(ただしシーケンスはやっぱり使う)。
不思議なキーワードで解決してよいなら、SERIALという連番型にしてもよい。
CREATE TABLE tablename (
colname SERIAL
);
は以下を指定することと同じ。
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;