2011-12-05 4 views
1

NOT NULL 열을 server 테이블에 추가하고 싶습니다. 문제는 테이블에 이미 레코드가 있다는 것입니다. ALTER TABLE server ADD COLUMN full_discovery_duration BIGINT NOT NULL을 호출 할 때 H2는 full_discovery_duration이 null 일 수 없다는 불평을합니다. DEFAULT 0을 지정하여 문제를 해결할 수 있지만 향후 inserts에 대한 기본 값은 필요하지 않습니다. 내가 뭘해야하니?H2 : 레코드가있는 테이블에 NOT NULL 열 추가

열을 기본값으로 추가하고 다음 문에서 열 정의에서 DEFAULT 0을 제거해야합니까? 더 좋은 방법이 있습니까?

답변

2

먼저 열을 기본값으로 추가 한 다음 기본값을 null로 설정할 수 있습니다. 그러나 기본 정의를 제거하는 것은 내가 아는 한 가능하지 않습니다.

다른 대안은 먼저 null을 허용 한 다음 값을 설정하고 나중에 null을 허용하지 않는 것입니다.

drop table server; 
create table server(id int); 
insert into server values(1); 
alter table server 
    add column 
    full_discovery_duration bigint; 
update server set full_discovery_duration = 0; 
alter table server 
    alter column 
    full_discovery_duration set not null; 
+1

다음 행을 실행하여 기본 정의를 제거했습니다 :'ALTER TABLE server ADD COLUMN cached_discovery_duration BIGINT NOT NULL DEFAULT 0; ALTER TABLE 서버 ALTER COLUMN cached_discovery_duration BIGINT NOT NULL;'첫 번째 행은 값이 '0'인 열을 추가합니다. 두 번째 줄은 기본값을 제거합니다. – Gili

0

기존 테이블에 열을 추가하는 동안 널값 열이거나 기본값을 지정해야합니다. 그리고 기본값을 제거하면 무엇을 의미합니까? null이 아닌 열에서 값을 제거하는 방법은 무엇입니까?

+0

다음 문장의 열 정의에서'DEFAULT 0'을 제거해야합니까? 그때까지, 모든 행은 이미 해당 열에 대해 널이 아닌 값을 갖도록 보장됩니다. – Gili

+0

'alter table ... default null'을 사용할 수 있습니다. 그것은 기본 정의를 제거하지 않지만 그 효과는 (최소한 내가 아는 한) 동일합니다. –

관련 문제