una tipo tabla postgres nombre mover modificar insertar datos dato columnas columna cambiar agregar adicionar postgresql alter notnull enterprisedb

tipo - modificar datos de una tabla en postgresql



Alterar el conjunto de columnas no nula falla (3)

La única explicación lógica sería un INSERT concurrente .
(Utilizando tbl lugar de la palabra reservada user como nombre de tabla).

ALTER TABLE tbl ADD COLUMN BUSINESS_ID VARCHAR2(50); --OK UPDATE tbl SET BUSINESS_ID = ID; //~1500 sec --OK HERE ALTER TABLE tbl ALTER COLUMN BUSINESS_ID SET NOT NULL;

Para evitar esto, use en su lugar:

ALTER TABLE tbl ADD COLUMN BUSINESS_ID VARCHAR(50) DEFAULT ''''; -- or whatever is appropriate ...

Entonces puede terminar con un valor predeterminado en algunas filas. Es posible que desee comprobar.

O ejecute todo como bloque de transacción y tome un bloqueo exclusivo para asegurarse:

BEGIN; LOCK tbl; ALTER ... UPDATE ... ALTER ... COMMIT;

Considere la siguiente tabla con aproximadamente 10M filas

CREATE TABLE user ( id bigint NOT NULL, ... CONSTRAINT user_pk PRIMARY KEY (id) ) WITH ( OIDS=FALSE )

Entonces apliqué el siguiente cambio

ALTER TABLE USER ADD COLUMN BUSINESS_ID VARCHAR2(50); --OK UPDATE USER SET BUSINESS_ID = ID; //~1500 sec --OK ALTER TABLE USER ALTER COLUMN BUSINESS_ID SET NOT NULL; ERROR: column "business_id" contains null values SQL state: 23502

Esto es muy extraño ya que la columna id (que se ha copiado en la columna business_id) no puede contener valores nulos ya que es la clave principal, pero para estar seguro de que la verifiqué

select count(*) from USER where BUSINESS_ID is null --0 records

Sospecho que esto es un error, solo me pregunto si me falta algo trivial.


No puedes hacer eso en la misma transacción. Añade tu columna y actualízala. Luego, en una transacción separada, establezca la restricción no nula.


Tal vez quiere un valor predeterminado? Postgresql docs en ALTER :

Para agregar una columna, use un comando como este:

ALTER TABLE products ADD COLUMN description text;

La nueva columna se rellena inicialmente con el valor predeterminado que se proporcione ( nulo si no especifica una cláusula DEFAULT ).

Asi que,

ALTER TABLE USER ALTER COLUMN BUSINESS_ID SET DEFAULT="", ALTER COLUMN BUSINESS_ID SET NOT NULL;