it-swarm.com.de

Tabelle der automatischen Inkrementierungstabelle

Mit Postgres versuche ich, AUTO_INCREMENT zu verwenden, um meinen Primärschlüssel automatisch in SQL zu nummerieren. Es gibt jedoch einen Fehler.

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

Der Fehler:

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

Irgendeine Idee warum?

25
Jimmy

Postgres 10 oder später

serial Spalten (siehe unten) bleiben unverändert. Aber betrachten Sie eine IDENTITY -Spalte. Postgres 10 implementiert diese Standard-SQL-Funktion.

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

Grundlegende Syntax und Informationen im Handbuch für CREATE TABLE .
Detaillierte Erklärung in diesem Blogeintrag seines Erstautors Peter Eisentraut.


Zu add einer IDENTITY-Spalte zu einer bereits vorhandenen Tabelle (mit Zeilen gefüllt oder nicht):

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

Um es gleichzeitig zur PK zu machen (Tabelle kann noch keine PK haben):

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

In früheren Versionen gab es einen Fehler, der zu einer Fehlermeldung führen konnte:

ERROR: column "staff_id" contains null values

Dies wurde mit Postgres 10.2 behoben. Einzelheiten:

Postgres 9.6 oder älter

Verwenden Sie stattdessen den Pseudodatentyp serial :

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

Das Sequenzobjekt wird automatisch erstellt und angehängt, und es wird DEFAULT in nextval() aus der Sequenz festgelegt. Es macht alles was Sie brauchen.

Ich benutze auch nur Kleinbuchstaben in meinem Beispiel. Erleichtert Ihr Leben mit Postgres.

Und benutze besser beschreibende Spaltennamen. "id" als Name ist ein Anti-Pattern, das von einigen Middleware-Produkten verwendet wird, aber kaum beschreibend ist. Ähnlich wie "Name".

65

In der SQL Server-Datenbank können Sie Identity(1,1) folgendermaßen verwenden:

CREATE TABLE Staff
(
    ID INT IDENTITY(1,1) NOT NULL,
    Name VARCHAR(40) NOT NULL,
    PRIMARY KEY (ID)
);
1
Royi Namir

Sie geben nicht an, welches RDBMS Sie verwenden. In SQL Server können Sie jedoch folgende Syntax verwenden:

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
1
Barry Kaye

PostgreSQL: Wenn Sie unbedingt einen eigenen automatischen Inkrementwert haben müssen:

Dann benutze eine Sequenz:

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)
0
Eric Leschinski