기존 열의 값과 동일한 기본값을 사용하여 테이블에 열 추가


90

기존 열의 값과 동일한 기본값을 사용하여 SQL Server 테이블에 열을 추가하는 방법은 무엇입니까?

이 T-SQL 문을 시도했습니다.

ALTER TABLE tablename 
ADD newcolumn type NOT NULL DEFAULT (oldcolumn) 

하지만 오류가 발생합니다.

이 컨텍스트에서는 "oldcolumn"이라는 이름이 허용되지 않습니다. 유효한 식은 상수, 상수 식 및 (일부 컨텍스트에서) 변수입니다. 열 이름은 허용되지 않습니다.


6
기본값은 다른 열이 아닌 상수 일 수 있습니다. 이것은 방아쇠가 필요하다고 생각합니다.
ypercubeᵀᴹ

1
좋아, 내가 어떻게 할 수 있니, 나는 SQL을 처음 사용한다.
dodos

1
항상 기본값이 될까요, 아니면 새 열이 테이블에 추가되는 동안 기존 행의 열을 채우기위한 것일까 요?
Damien_The_Unbeliever

1
@Damien_The_Unbeliever는 기존 행의 열을 채우기위한 것입니다.
dodos

2
당신은 그것을 별도로해야합니다 UPDATE.
Damien_The_Unbeliever

답변:


73

이 시도:

ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0)
Go
Update tablename SET newcolumn = oldcolumn Where newcolumn = 0
Go

5
.. 예,하지만 이것은 기존 행에서만 작동합니다. 새 행이 삽입 될 때 [newcolumn] 값을 설정하지 않습니다. 당신은 등 INSERT 트리거 이후에 필요
밀라노

14
이것은 테이블에 의도하지 않은 기본 제약 조건을 추가합니다
Romain Vergnory

1
@RomainVergnory 동의합니다. 처음에는 NOT NULL로 제한없이 이동 한 다음 기존 열로 값을 채운 다음 나중에 NOT NULL을 다시 추가하는 것이
좋습니다

15

나는 그것들을별로 좋아하지 않지만 여기에 AFTER INSERT트리거로 이것을 할 수있는 방법이 있습니다.

CREATE TRIGGER TableX_AfterInsert_TRG 
  ON TableX 
AFTER INSERT
AS
  UPDATE TableX AS t
  SET t.newcolumn = t.oldcolumn
  FROM Inserted AS i
  WHERE t.PK = i.PK ;              -- where PK is the PRIMARY KEY of the table   

13

AFTER INSERT트리거 방식으로 인해 추가 오버 헤드 포함 UPDATE문. INSTEAD OF INSERT다음과 같이 트리거를 사용하는 것이 좋습니다 .

CREATE TRIGGER tablename_on_insert ON tablename 
INSTEAD OF INSERT 
AS
INSERT INTO tablename (oldcolumn, newcolumn)
SELECT oldcolumn, ISNULL(newcolumn, oldcolumn)
FROM inserted

oldcolumn자동 식별 열인 경우 작동하지 않습니다 .


2
INSTEAD OF트리거는 시간 테이블을 사용할 때도 작동하지 않습니다.SYSTEM_VERSIONING = ON
CalvinDale

3

Kapil 의 답변 을 확장 하고 원치 않는 기본 제약 조건을 피하려면 다음을 시도하십시오.

ALTER TABLE tablename ADD newcolumn type NOT NULL CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN DEFAULT -9999
Go
Update tablename SET newcolumn = oldcolumn
Go
ALTER TABLE tablename DROP CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN
Go

유형이 varchar, nvarchar, datetime, ... 인 경우 -9999를 'noData'로 바꾸거나 다른 유형의 호환 가능한 데이터로 바꿉니다. 특정 값은 중요하지 않으며 두 번째 명령에 의해 지워집니다.


1

계산 된 열을 사용하여 기존 열 값을 기반으로 테이블에 새 열을 삽입 할 수 있습니다.

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;

또는 기존 열 값을 기반으로 값을 변경하려면 다음을 사용하십시오.

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;

0

제 경우에는 CODE라는 새로운 not null 고유 열을 추가하고 싶지만 생성 시점의 값에 대해 알지 못합니다. NewID ()에서 기본값을 가져온 다음 나중에 업데이트하여 기본값을 설정했습니다.

ALTER TABLE [WIDGET] ADD [CODE] CHAR(5) NOT NULL DEFAULT(SUBSTRING(CONVERT(CHAR(36), NEWID()), 1, 5))

ALTER TABLE [dbo].[WIDGET] WITH CHECK ADD CONSTRAINT [UQ_WIDGET_CODE] UNIQUE ([CODE])

-3

나는 당신이 사용하는 경우 작동합니다 생각 Set Identity_Insert <TableName> OFF하고 그냥 사용을 쓴 INSERT 문 후 Set Identity_Insert <TableName> ON.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.