Varsayılan değeri mevcut bir sütunun değerine eşit olan bir tabloya sütun ekleyin


94

Varolan bir sütunun değerine eşit bir varsayılan değere sahip bir SQL Server tablosuna sütun nasıl eklenir?

Bu T-SQL ifadesini denedim:

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

ama bir hata veriyor:

Bu bağlamda "eski sütun" adına izin verilmez. Geçerli ifadeler sabitler, sabit ifadeler ve (bazı bağlamlarda) değişkenlerdir. Sütun adlarına izin verilmez.


6
Varsayılan değer başka bir sütun değil, sabit olabilir. Bunun bir tetikleyiciye ihtiyacı var bence.
ypercubeᵀᴹ

1
tamam, bunu nasıl yapabilirim, sql'de yeniyim.
doesdos

1
Bu her zaman varsayılan mı olacak, yoksa bu sadece yeni sütun tabloya eklenirken mevcut satırlar için sütunu doldurmak için mi?
Damien_The_Unbeliever

1
@Damien_The_Unbeliever sadece mevcut satırlar için sütunu doldurmak için.
doesdos

2
UPDATEKorkarım bunu ayrı yapmak zorundasın .
Damien_The_Unbeliever

Yanıtlar:


73

Bunu dene:

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

6
.. evet, ancak bu yalnızca mevcut satırlar için çalışacaktır. Yeni satırlar eklendiğinde [yeni sütun] değerini ayarlamaz. SONRA INSERT tetiğine vb. İhtiyacınız var.
Milan

16
Bu, tabloya muhtemelen istenmeyen bir varsayılan kısıtlama ekler
Romain Vergnory

1
@RomainVergnory Kabul ediyorum, önce NULL ile sınırlama olmaksızın gitmek, ardından değerleri mevcut sütunla doldurmak ve daha sonra tekrar bir NOT NULL eklemek daha
iyidir

15

Onları pek sevmiyorum ama işte bunu bir AFTER INSERTtetikleyici ile nasıl yapabilirsiniz :

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   

15

AFTER INSERTTetik yaklaşımı nedeniyle fazladan için havai gerektirir UPDATEaçıklamada. INSTEAD OF INSERTAşağıdaki gibi bir tetikleyici kullanmanızı öneririm :

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

oldcolumnOtomatik kimlik sütunu olsa da bu çalışmaz .


2
INSTEAD OFgeçici tablolar kullanılırken tetikleyiciler de çalışmaz:SYSTEM_VERSIONING = ON
CalvinDale

1
Varsayılan değer için kullanmak istediğiniz sütun, yukarıda belirtildiği gibi bir kimlik sütunu olmadığı sürece, Yerine Ekleme tetikleyicisi tam olarak doğru cevaptır, çünkü Yerine tetikleyiciler, tablo ekleme ve kimlik sütunlarından önce yürütülür (ve yapmaktan sorumludur). Ekleme gerçekleşene kadar otomatik değerler alın. Sütun, başlangıç ​​varsayılan değeri olmadan boş değil olarak tanımlanmışsa, kayıt ekleme sırasında bir sütunu başka bir sütunun değerine varsayılan yapmanın başka bir yolunu bilmiyorum.
Chuck Bevitt

4

Kapil'in yanıtını genişletmek ve istenmeyen varsayılan kısıtlamalardan kaçınmak için şunu deneyin:

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

Türünüz varchar, nvarchar, datetime, ... ise -9999'u "noData" ile veya diğer türler için uyumlu herhangi bir veri ile değiştirin: belirli değerin önemi yoktur, 2. komut tarafından silinir.


2

Mevcut bir sütun değerine göre bir tabloya yeni sütun eklemek için hesaplanan sütunu kullanabilirsiniz.

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

VEYA, değerde mevcut sütun değerine göre bazı değişiklikler yapmak istiyorsanız, şunu kullanın:

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

bu doğru cevap sanırım, resmi cevap sadece bir kez güncelleniyor, doğru yol uzun vadeli ve tutarlı hale getirmek
Kat Lim Ruiz

0

Benim durumum için, CODE adında yeni bir boş olmayan benzersiz sütun eklemek istiyorum, ancak oluşturma sırasındaki değeri bilmiyorum. Bunun için varsayılan değeri NewID'den () varsayılan bir değer alarak ayarladım ve daha sonra güncelledim.

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> OFFYazdığınız İfadeyi eklerseniz ve sonra sadece kullanırsanız işe yarayacağını düşünüyorum Set Identity_Insert <TableName> ON.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.