Bagaimana cara menambahkan kolom ke tabel SQL Server dengan nilai default yang sama dengan nilai kolom yang sudah ada?
Saya mencoba pernyataan T-SQL ini:
ALTER TABLE tablename
ADD newcolumn type NOT NULL DEFAULT (oldcolumn)
tetapi memberikan kesalahan:
Nama "oldcolumn" tidak diizinkan dalam konteks ini. Ekspresi yang valid adalah konstanta, ekspresi konstan, dan variabel (dalam beberapa konteks). Nama kolom tidak diizinkan.
sql
sql-server-2008
doesdos
sumber
sumber
UPDATE
, saya khawatir.Jawaban:
Coba ini:
ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0) Go Update tablename SET newcolumn = oldcolumn Where newcolumn = 0 Go
sumber
Saya tidak terlalu menyukai mereka, tetapi inilah cara Anda melakukan ini dengan
AFTER INSERT
pemicu: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
sumber
The
AFTER INSERT
Pendekatan memicu melibatkan biaya overhead karena tambahanUPDATE
pernyataan. Saya sarankan menggunakanINSTEAD OF INSERT
pemicu, sebagai berikut:CREATE TRIGGER tablename_on_insert ON tablename INSTEAD OF INSERT AS INSERT INTO tablename (oldcolumn, newcolumn) SELECT oldcolumn, ISNULL(newcolumn, oldcolumn) FROM inserted
Ini tidak berfungsi meskipun jika itu
oldcolumn
adalah kolom identitas otomatis.sumber
INSTEAD OF
pemicu juga tidak berfungsi saat menggunakan tabel temporal:SYSTEM_VERSIONING = ON
Untuk memperluas jawaban Kapil , dan menghindari batasan default yang tidak diinginkan, coba ini:
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
Ganti -9999 dengan 'noData' jika tipe Anda adalah varchar, nvarchar, datetime, ... atau dengan data yang kompatibel untuk tipe lain: nilai spesifik tidak masalah, itu akan dihapus oleh instruksi ke-2.
sumber
Anda dapat menggunakan kolom terhitung untuk menyisipkan kolom baru dalam tabel berdasarkan nilai kolom yang sudah ada
ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;
ATAU, jika Anda ingin membuat beberapa perubahan pada nilai berdasarkan nilai kolom yang ada, gunakan
ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;
sumber
Untuk kasus saya, saya ingin menambahkan kolom unik bukan null baru bernama CODE tetapi saya tidak tahu tentang nilai pada saat pembuatan. Saya menetapkan nilai default untuk itu dengan mendapatkan nilai default dari NewID () kemudian memperbarui nanti.
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])
sumber
Saya pikir ini akan berhasil jika Anda menggunakan
Set Identity_Insert <TableName> OFF
dan setelah penyisipan Pernyataan yang Anda tulis baru saja digunakanSet Identity_Insert <TableName> ON
.sumber