sql - valor - Columna de tabla de incremento automático
modificar columna sql server (4)
Utilizando Postgres, estoy tratando de usar AUTO_INCREMENT
para numerar mi clave principal automáticamente en SQL. Sin embargo, me da un error.
CREATE TABLE Staff (
ID INTEGER NOT NULL AUTO_INCREMENT,
Name VARCHAR(40) NOT NULL,
PRIMARY KEY (ID)
);
El error:
********** Error ********** ERROR: syntax error at or near "AUTO_INCREMENT" SQL state: 42601 Character: 63
¿Alguna idea de por qué?
Postgres 10 o posterior
Considere una columna de IDENTITY
. Postgres 10 implementa esta función de SQL estándar.
CREATE TABLE staff (
staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
, staff text NOT NULL
);
Sintaxis básica e información en el manual de CREATE TABLE
.
Explicación detallada en esta entrada del blog de su autor principal, Peter Eisentraut.
Para agregar una columna de IDENTITY
a una tabla preexistente (rellenada con filas o no):
ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY;
Para hacerlo también PK al mismo tiempo (la tabla no puede tener un PK todavía):
ALTER TABLE staff ADD COLUMN staff_id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY;
Hubo un error en las primeras versiones, que podría conducir a un mensaje de error como:
ERROR: column "staff_id" contains null values
Esto fue arreglado con Postgres 10.2. Detalles:
Postgres 9.6 o anterior
Utilice serial
lugar el tipo de pseudodato serial
:
CREATE TABLE staff (
staff_id serial PRIMARY KEY,
, staff text NOT NULL
);
Crea y adjunta el objeto de secuencia automáticamente y establece el DEFAULT
en nextval()
de la secuencia. Hace todo lo que necesitas.
También uso solo identificadores minúsculas en mi ejemplo. Hace que tu vida con Postgres sea más fácil.
Y mejor utilizar nombres de columna descriptivos. "id" como nombre es un antipatrón, utilizado por algunos medios, pero no es descriptivo. Similar con "nombre".
En la base de datos del servidor SQL puede usar Identity(1,1)
esta manera:
CREATE TABLE Staff
(
ID INT IDENTITY(1,1) NOT NULL,
Name VARCHAR(40) NOT NULL,
PRIMARY KEY (ID)
);
No especifica qué RDBMS está utilizando, sin embargo, en SQL Server puede usar esta sintaxis:
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: si absolutamente debe tener su propio valor de incremento automático:
Luego usa una secuencia:
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)