38

AUTO_INCREMENTPostgres を使用して、SQL で主キーに自動的に番号を付けようとしています。ただし、エラーが発生します。

CREATE TABLE Staff   (
  ID        INTEGER NOT NULL AUTO_INCREMENT,
  Name      VARCHAR(40) NOT NULL,
  PRIMARY KEY (ID)
);

エラー:

********** Error **********
ERROR: syntax error at or near "AUTO_INCREMENT"
SQL state: 42601
Character: 63

理由はありますか?

4

4 に答える 4

90

Postgres10以降

serial列(以下を参照)は変更されません。しかし、IDENTITY列について考えてみましょう。Postgres 10は、この標準SQL機能を実装しています。

のマニュアルのCREATE TABLE基本的な構文と情報。主な著者であるPeterEisentrautの
このブログエントリの詳細な説明。

IDENTITY列のあるテーブルを作成する

CREATE TABLE staff (
   staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
 , staff    text NOT NULL
);

IDENTITY既存のテーブルに列を追加します

テーブルには行が入力されている場合とされていない場合があります。

ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY;

同時にそれをPKにするために(テーブルはまだPKを持つことができません):

ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY;

関連している:

serial置き換えますIDENTITY

見る:

Postgres9.6以前

(または実際には任意のバージョン。)代わりに疑似データ型
を 使用してください。serial

CREATE TABLE staff (
   staff_id serial PRIMARY KEY,
 , staff    text NOT NULL
);

シーケンスオブジェクトを自動的に作成してアタッチし、シーケンスからDEFAULTtoを設定しnextval()ます。それはあなたが必要とするすべてをします。

この例では小文字の識別子を使用しました。Postgresでの生活を楽にします。

于 2012-03-26T15:59:37.043 に答える
1

使用しているRDBMSを指定しませんが、SQLServerでは次の構文を使用できます。

CREATE TABLE [dbo].[Staff]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] VARCHAR(40) NOT NULL,
CONSTRAINT [ID] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
于 2012-03-26T15:47:54.907 に答える
0

PostgreSQL: どうしても独自の自動インクリメント値が必要な場合:

次に、シーケンスを使用します。

ericlesc_schools=> drop table yar;
DROP TABLE
ericlesc_schools=> drop sequence user_id_seq;
DROP SEQUENCE
ericlesc_schools=> create sequence user_id_seq;
CREATE SEQUENCE
ericlesc_schools=> create table yar(
                   id int default nextval('user_id_seq'), 
                   foobar varchar);
CREATE TABLE
ericlesc_schools=> insert into yar (foobar) values('hey alex');
INSERT 0 1
ericlesc_schools=> insert into yar (foobar) values('hey what derick');
INSERT 0 1
ericlesc_schools=> insert into yar (foobar) values('I look like a hushpuppy');
INSERT 0 1

ericlesc_schools=> select * from yar;
 id |     foobar      
----+-----------------
  1 | hey alex
  2 | hey what derick
  3 | I look like a hushpuppy
(3 rows)
于 2015-04-07T03:13:48.007 に答える
0

Identity(1,1)SQL サーバー データベースでは、次のように使用できます。

CREATE TABLE Staff
(
    ID INT IDENTITY(1,1) NOT NULL,
    Name VARCHAR(40) NOT NULL,
    PRIMARY KEY (ID)
);
于 2012-03-26T15:44:11.787 に答える