[sql] null을 허용하지 않는 Postgresql 데이터베이스에 열을 어떻게 추가합니까?

다음 쿼리를 사용하여 Postgresql 데이터베이스에 “NOT NULL”열을 새로 추가하고 있습니다 (인터넷에서 삭제).

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;

이 쿼리를 실행할 때마다 다음과 같은 오류 메시지가 나타납니다.

ERROR:  column "mycolumn" contains null values

나는 충격을 받았다. 내가 어디로 잘못 가고 있니?

참고 : 나는 주로 pgAdmin III (1.8.4)를 사용하고 있지만 터미널 내에서 SQL을 실행할 때 동일한 오류가 발생했습니다.



답변

기본값을 설정해야합니다.

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL DEFAULT 'foo';

... some work (set real values as you want)...

ALTER TABLE mytable ALTER COLUMN mycolumn DROP DEFAULT;


답변

다른 사람들이 관찰했듯이 널 입력 가능 열을 작성하거나 DEFAULT 값을 제공해야합니다. 융통성이 충분하지 않은 경우 (예 : 각 행마다 개별적으로 새 값을 계산해야하는 경우) PostgreSQL에서 모든 DDL 명령을 트랜잭션 내에서 실행할 수 있다는 사실을 사용할 수 있습니다.

BEGIN;
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50);
UPDATE mytable SET mycolumn = timeofday();    -- Just a silly example
ALTER TABLE mytable ALTER COLUMN mycolumn SET NOT NULL;
COMMIT;


답변

테이블에 행이 이미 있으므로 ALTER명령문이 NULL기존의 모든 행에 대해 새로 작성된 열에 삽입하려고합니다 . 열을 허용으로 추가 NULL한 다음 원하는 값으로 열을 채운 NOT NULL후 나중에 설정해야합니다 .


답변

기본값을 정의하거나 Sean이 말한 것을 수행하고 기존 행에 채워질 때까지 null 제약 조건없이 추가해야합니다.


답변

기본값이 적절하다고 가정하면 기본값을 지정해도 작동합니다.


답변

또는 추가 열을 사용하여 임시 테이블로 새 테이블을 작성하고 널 입력 불가능한 새 열을 채우는 데 필요한만큼 조작하면서 데이터를이 새 테이블에 복사 한 다음 2 단계 이름 변경을 통해 테이블을 교환하십시오.

예, 더 복잡하지만 라이브 테이블에서 큰 업데이트를 원하지 않는 경우이 방법을 사용해야 할 수도 있습니다.


답변

이 쿼리는 null을 자동 업데이트합니다.

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;