Postgresを使用して、AUTO_INCREMENT
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
理由は何ですか?
serial
列(以下を参照)は変更されません。ただし、IDENTITY
列を検討してください。 Postgres 10は、この標準SQL機能を実装しています。
_CREATE TABLE staff (
staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
, staff text NOT NULL
);
_
_CREATE TABLE
_のマニュアル の基本的な構文と情報。
これの詳細な説明 その主要著者であるPeter Eisentrautのブログエントリ
ToaddIDENTITY
列を既存のテーブルに追加します(行が入力されます)か否か):
_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;
_
初期バージョンにはバグがあり、次のようなエラーメッセージが表示される可能性がありました。
_ERROR: column "staff_id" contains null values
_
これはPostgres 10.2で修正されました。詳細:
代わりに serial
擬似データ型 を使用します。
_CREATE TABLE staff (
staff_id serial PRIMARY KEY,
, staff text NOT NULL
);
_
シーケンスオブジェクトを自動的に作成してアタッチし、シーケンスからDEFAULT
をnextval()
に設定します。それはあなたが必要とするすべてを行います。
私の例では 小文字の識別子 も使用しています。 Postgresでの生活を楽にします。
また、わかりやすい列名を使用することをお勧めします。名前としての「id」はアンチパターンであり、一部のミドルウェアで使用されますが、ほとんど説明的ではありません。 「名前」と同様。
SQLサーバーデータベースでは、次のようにIdentity(1,1)
を使用できます。
CREATE TABLE Staff
(
ID INT IDENTITY(1,1) NOT NULL,
Name VARCHAR(40) NOT NULL,
PRIMARY KEY (ID)
);
使用しているRDBMSを指定しませんが、SQL Serverでは次の構文を使用できます。
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
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)