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

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

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

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

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

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



답변

이 시도:

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


답변

나는 그것들을별로 좋아하지 않지만 여기에 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   


답변

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자동 식별 열인 경우 작동하지 않습니다 .


답변

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’로 바꾸거나 다른 유형의 호환 가능한 데이터로 바꿉니다. 특정 값은 중요하지 않으며 두 번째 명령에 의해 지워집니다.


답변

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

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

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

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


답변

제 경우에는 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])


답변

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