1

このSQLスクリプトを適用します。

create table software (
  id                        bigint not null,
  name                      varchar(255),
  description               varchar(255),
  constraint pk_software primary key (id))
;

create sequence software_seq;

次にこれ:

alter sequence software_seq start with 1000;;

insert into software (id, name, description) values (  1, 'Soft1', 'Description1');

次に、プログラムで(javaから)新しいソフトウェアを挿入すると、 id=24の新しいソフトウェアが取得されます

なぜ1001ではないのですか?'alter sequence software_seq start with 1000 ;'

4

2 に答える 2

5

ここでいくつか間違っていることがあります。

まず、特定の名前でシーケンスを作成するだけでは、それを使用するテーブルと列にアタッチされません。デフォルト値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

データ型smallserialserialおよび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

于 2012-12-09T01:48:03.353 に答える
0

たぶん私は得た。シーケンスを変更したい場合は、次の構文を使用する必要があります。

ALTER SEQUENCE sequenceName [RESTART WITH long] [INCREMENT BY long]

つまり、「RESTART」を使用しますが、「START」は使用しません

テストしました。新しい値を挿入すると、実際には1000から始まります。

于 2012-12-09T01:46:34.097 に答える