establecer el valor predeterminado cuando se agrega 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 manera de saber qué valores deben ser cambiados ; no hay indicador "esta columna tiene el valor predeterminado" en los valores de columna, solo existe el valor predeterminado (originalmente NULL ya que no especificaste nada más) y el valor actual (también NULL) pero forma de decir la diferencia entre "NULL porque es el valor predeterminado "y" NULO porque se estableció explícitamente en NULL ". Entonces, cuando lo hace en dos pasos:
- Agregue la columna.
- Cambiar el 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 no sabe qué filas tienen el valor predeterminado (todas ellas) para que pueda suministrar valores a medida que se agrega la columna.
Por cierto, es probable que quieren un NOT NULL en la columna también:
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 sólo va a utilizar rid_seq
para su columna test.rid
entonces es posible que desee set its owner column a test.rid
modo que la secuencia se eliminará si la columna se retira:
alter sequence rid_seq owned by test.rid;
Gracias por el fragmento. Me estoy encontrando con errores de sintaxis cuando trato de ejecutarlo: 'en o cerca de @'. No estoy familiarizado con la definición de variables en Postgreqsl, así que no estoy seguro de si hay algo obvio que deba cambiar. – djq
(1) Que se parece a SQL Server o posiblemente a la sintaxis de MySQL, no funcionará en PostgreSQL. (2) Eso causará algunos problemas tan pronto como se agreguen nuevas filas, ya que no está utilizando los valores de la secuencia, el siguiente valor que saldrá de la secuencia será 1 aunque ya lo haya usado para ' librarse' –
Buena captura, [mu es demasiado corta] (http://stackoverflow.com/users/479863/mu-is-too-short), sobre no usar los valores de secuencia. Y sí, soy bastante bueno escribiendo el código del Servidor MS SQL (con el que habría abordado esto de forma un poco diferente) y no estoy familiarizado con PostgreSQL en absoluto.El punto que estaba tratando de hacer fue la diferencia entre definir una restricción y aplicarla, que la respuesta explicada mejor que yo. –