2012-02-26 46 views
24

¿Cómo puedo crear una secuencia en una tabla para que vaya de 0 -> Valor máximo? He intentado usar el siguiente código SQL, pero no inserta los valores en la tabla que estoy usando:Crear una secuencia en una tabla existente

CREATE SEQUENCE rid_seq; 
ALTER TABLE test ADD COLUMN rid INTEGER; 
ALTER TABLE test ALTER COLUMN rid SET DEFAULT nextval('rid_seq'); 

La tabla que estoy tratando de insertar la secuencia en la salida es de otra consulta. No puedo entender si tiene más sentido agregar la secuencia durante esta consulta inicial, o agregar la secuencia a la tabla después de que se realiza la consulta.

Respuesta

-3

No hablo con fluidez postgresql, así que no estoy familiarizado con la declaración "CREATE SEQUENCE". Sin embargo, pensaría que estás agregando la definición de la columna correctamente. Sin embargo, agregar la columna no inserta datos automáticamente para las filas existentes. Una restricción POR DEFECTO es para nuevas filas. Intente agregar algo como esto luego para completar datos en las filas existentes.

DECLARE @i Int 
SET @i = 0 
SET ROWCOUNT 1 
WHILE EXISTS (SELECT 1 FROM test WHERE rid IS NULL) BEGIN 
    UPDATE test SET rid = @i WHERE rid IS NULL 
END 
SET ROWCOUNT 0 
+0

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

+0

(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' –

+0

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. –

37

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:

  1. Agregue la columna.
  2. 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; 
+3

Probablemente también quiera hacer de esa columna el "propietario" de la secuencia, para que PostgreSQL lo sepa pertenece a esa columna: 'alterar secuencia rid_sequence owner to test.rid' –

+0

¿es posible hacer personalizar el valor de secuencia como" REQ0001-REQ000N "en la tabla existente? – Angger

+0

@Angger Las secuencias son numéricas, por lo que en realidad no lo son. Puede falsificarlo al concatenar dos columnas o concatenar una cadena con una secuencia independiente. –

1

En PostgreSQL:

UPDATE your_table SET your_column = nextval('your_sequence') 
WHERE your_column IS NULL; 
Cuestiones relacionadas