ここでいくつか間違っていることがあります。
まず、特定の名前でシーケンスを作成するだけでは、それを使用するテーブルと列にアタッチされません。デフォルト値software.id
に使用するように変更する必要があります。software_seq
alter table software alter column id set default nextval('software_seq');
また、シーケンスの所有権も変更する必要があります(もちろん、他の場所でシーケンスを使用している場合を除く)。
OWNED BY table_name.column_name
OWNED BY NONE
このOWNED BY
オプションを使用すると、シーケンスが特定のテーブル列に関連付けられ、その列(またはそのテーブル全体)が削除されると、シーケンスも自動的に削除されます。指定されている場合、この関連付けは、シーケンスに対して以前に指定された関連付けを置き換えます。指定されたテーブルは、同じ所有者を持ち、シーケンスと同じスキーマにある必要があります。指定OWNED BY NONE
すると、既存の関連付けが削除され、シーケンスが「独立」になります。
だからあなたはすべきです:
alter sequence software_seq owned by software.id;
次に、挿入するときに、id
:を省略します。
insert into software (name, description) values ('...', '...');
またはDEFAULTを指定します。
insert into software (id, name, description) values (default, '...', '...');
あなたの他の問題は、それstart with
があなたが思っていることをしないということです:
start
オプションの句START WITH
startは、シーケンスの記録された開始値を変更します。これは、現在のシーケンス値には影響しません。将来のALTER SEQUENCE RESTART
コマンドが使用する値を設定するだけです。
シーケンスを1000から開始する場合は、次のことができます。
alter sequence software_seq restart with 1000;
または、次を使用することもできますsetval
。
select setval('software_seq', 1000);
もちろん、次を使用することもできますbigserial
:
データ型smallserial
、serial
およびbigserial
は真の型ではありませんが、一意の識別子列を作成するための表記上の便宜にすぎません(他のデータベースでサポートされているAUTO_INCREMENTプロパティと同様)。現在の実装では、以下を指定します。
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;
したがってbigserial
、列タイプとして使用すると、id
すべてのシーケンスが設定されます。alter sequence
次に、またはを使用する前と同じように開始値を設定しますsetval
。