sql >> Base de Datos >  >> RDS >> PostgreSQL

Crear una secuencia en una tabla existente

Establezca el valor predeterminado cuando agregue la nueva columna:

create sequence rid_seq;
alter table test add column rid integer default nextval('rid_seq');

Alterar el valor predeterminado para las columnas existentes no cambia los datos existentes porque la base de datos no tiene forma de saber qué valores se deben cambiar; no hay un indicador de "esta columna tiene el valor predeterminado" en los valores de columna, solo existe el valor predeterminado (originalmente NULL ya que no especificó nada más) y el valor actual (también NULL), pero es una forma de diferenciar entre "NULL porque es el predeterminado" y "NULL porque se estableció explícitamente en NULL". Entonces, cuando lo haces en dos pasos:

  1. Añadir columna.
  2. Cambiar valor predeterminado.

PostgreSQL no aplicará el valor predeterminado a la columna que acaba de agregar. Sin embargo, si agrega la columna y proporciona el valor predeterminado al mismo tiempo, PostgreSQL sabe qué filas tienen el valor predeterminado (todas) para que pueda proporcionar valores a medida que se agrega la columna.

Por cierto, probablemente también quieras un NOT NULL en esa columna:

create sequence rid_seq;
alter table test add column rid integer not null default nextval('rid_seq');

Y, como a_horse_with_no_name notas, si solo tiene la intención de usar rid_seq para su test.rid entonces es posible que desee establecer su columna de propietario a test.rid para que la secuencia se elimine si se elimina la columna:

alter sequence rid_seq owned by test.rid;