기존 열의 값과 동일한 기본값을 사용하여 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
.