Cara menetapkan nilai default untuk kolom yang ada

375

Ini tidak berfungsi di SQL Server 2008:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

Kesalahannya adalah:

Sintaksis salah di dekat kata kunci 'SET'.

Apa yang saya lakukan salah?

Nakul Chaudhary
sumber
1
Apa yang Anda baca dari MSDN ALTER TABLE katakan ...? msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
gbn
1
Itu adalah sintaks mysql.
Benjamin Goodacre
mengapa tidak semua orang bisa tetap berpegang pada standar? (bukan pertanyaan nyata, semua orang mengacu pada microsoft dan mysql atau vendor lain). apakah ada cara standar ansi / iso untuk melakukan ini?
joedotnot

Jawaban:

566

Ini akan bekerja di SQL Server:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
Yuck
sumber
62
+1 untuk menentukan nama kendala, jadi SQL Server tidak membuat nama acak.
HardCode
36
MSSQL aneh untuk memanggil nilai default "kendala". Jika ada, itu adalah relaksasi ; yang berlawanan dari kendala! Mereka membuat lebih banyak hal yang valid, tidak sedikit.
Roman Starkov
4
Tidak aneh jika Anda berpikir dengan cara alternatif seperti: Batasan default mencegah MSSQL untuk melempar kesalahan jika Anda tidak menentukan kolom. Jadi itu bukan kendala bagi pengguna, tetapi merupakan kendala bagi MSSQL.
Jonny Piazzi
4
Ini hanya berfungsi jika tidak ada batasan default yang ada pada kolom.
pmcilreavy
4
@fallenidol Ini hanya berfungsi jika tidak ada batasan default yang ada pada kolom. Benar, karena menurut definisi Anda tidak dapat memiliki lebih dari satu nilai default ...
Yuck
165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn
hoodaticus
sumber
3
Ini berfungsi di MSSQL, tetapi memiliki kelemahan karena tidak menyebutkan kendala yang dibuatnya di belakang layar (lihat jawaban yang lebih tinggi di atas).
Contango
10
@ Contango Saya pikir lebih baik untuk tidak repot-repot memberi nama setiap kendala pada offchance Anda perlu memodifikasi salah satunya. Cukup tulis prosedur untuk menjatuhkan batasan yang bernama otomatis dan Anda tidak perlu menyebutkan satu lagi + dapat menangani semua yang tidak disebutkan namanya lainnya
JonnyRaa
3
@Jonny Leeds. Poin yang bagus. Saya juga ingin menyebutkan batasannya, karena ini adalah dokumentasi yang bagus untuk orang lain yang mencoba memodifikasi (atau sekadar memahami) skema basis data. Ini kurang penting jika seseorang adalah operator solo yang bekerja dalam satu tim.
Contango
1
(EESH! Maaf tentang kurangnya umpan baris - disisipkan di bawah ini untuk kejelasan!) Saya membutuhkannya untuk dapat dijalankan kembali dan menemukan cara ini untuk memeriksa apakah sudah dilakukan ... JIKA ADA (SELECT * FROM information_schema.columns MANA table_name = 'myTable' AND column_name = 'myColumn' AND Table_schema = 'myDBO' AND column_default IS NULL) BEGIN ALTER TABLE [myDBO]. [myTable] ADD DEFAULT 0 UNTUK [myColumn] END
Dave
4
Jika hanya ada satu kendala standar ... mengapa Anda harus menamainya? Sepertinya mesin database lain menyediakan sintaks untuk menambah, memperbarui, menghapus nilai default untuk kolom tanpa nama apa pun selain nama kolom, yang masuk akal. Kode di atas gagal, btw, jika default sudah ada. Sungguh konyol bahwa SQL Server memerlukan gabungan kompleks terhadap tabel sistem hanya untuk mengidentifikasi nama batasan default, yang seharusnya tidak perlu karena hanya ada satu kendala standar pada kolom.
Triynko
51

tidak dapat menggunakan kolom ubah untuk itu, gunakan tambahkan saja

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn
Carlos Quintanilla
sumber
9
tidak tahu mengapa jawaban ini tidak mendapatkan upvotes. Persis sama dengan yang sebelumnya dan dijawab sebelumnya ...
spankmaster79
30

Cara yang benar untuk melakukan ini adalah sebagai berikut:

  1. Jalankan perintah:

    sp_help [table name] 
  2. Salin nama CONSTRAINT.

  3. Jatuhkan DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. Jalankan perintah di bawah ini:

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]
pengguna3310402
sumber
4
StackOverflow.com adalah bahasa Inggris saja. Situs Portugis adalah pt.stackoverflow.com
Martin Smith
Ini tidak menambahkan apa pun yang baru untuk jawaban lain, adalah metode manual - tidak dapat dituliskan, dan dinyatakan sebagai "cara yang benar" ..
Andre Figueiredo
12

Solusi Hoodaticus sempurna, terima kasih, tetapi saya juga membutuhkannya untuk dapat dijalankan kembali dan menemukan cara ini untuk memeriksa apakah sudah dilakukan ...

IF EXISTS(SELECT * FROM information_schema.columns 
           WHERE table_name='myTable' AND column_name='myColumn' 
             AND Table_schema='myDBO' AND column_default IS NULL) 
BEGIN 
  ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
END
Dave
sumber
7

Ada dua skenario di mana nilai default untuk kolom bisa diubah,

  1. Pada saat membuat tabel
  2. Ubah kolom yang ada untuk tabel yang ada.

  1. Pada saat membuat tabel / membuat kolom baru.

Pertanyaan

create table table_name
(
    column_name datatype default 'any default value'
);
  1. Ubah kolom yang ada untuk tabel yang ada

Dalam hal ini server SQL saya tidak memungkinkan untuk mengubah nilai batasan default yang ada. Jadi untuk mengubah nilai default kita perlu menghapus sistem yang ada yang dihasilkan atau batasan standar yang dihasilkan pengguna. Dan setelah itu nilai default dapat diatur untuk kolom tertentu.

Ikuti beberapa langkah:

  1. Daftar semua batasan nilai default yang ada untuk kolom.

Jalankan prosedur database sistem ini, dibutuhkan nama tabel sebagai parameter. Ini mengembalikan daftar semua batasan untuk semua kolom dalam tabel.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. Jatuhkan kendala default yang ada untuk kolom.

Sintaksis:

alter table 'table_name' drop constraint 'constraint_name'
  1. Tambahkan batasan nilai default baru untuk kolom itu:

Sintaksis:

alter table 'table_name' add default 'default_value' for 'column_name'

Bersulang @!!!

Sunil Sharma
sumber
5

dalam hal pembatasan sudah ada dengan nama standarnya:

-- Drop existing default constraint on Employee.CityBorn
DECLARE @default_name varchar(256);
SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);

-- Add default constraint on Employee.CityBorn
ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;
tibx
sumber
4
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]
steave
sumber
4

Anda dapat menggunakan sintaks berikut, Untuk informasi lebih lanjut lihat pertanyaan dan jawaban ini: Menambahkan kolom dengan nilai default ke tabel yang ada di SQL Server

Sintaks:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

Contoh:

ALTER TABLE SomeTable
ADD SomeCol Bit NULL --Or NOT NULL.
CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is 
autogenerated.
DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

Cara lain :

Klik kanan pada tabel dan klik Desain, lalu klik kolom yang ingin Anda tetapkan nilai default.

Kemudian di bagian bawah halaman tambahkan nilai default atau mengikat: sesuatu seperti '1' untuk string atau 1 untuk int.

Mohamad Reza Shahrestani
sumber
3

Hanya Ditemukan 3 langkah sederhana untuk mengubah kolom yang sudah ada yang sebelumnya nol

update   orders
set BasicHours=0 where BasicHours is null

alter table orders 
add default(0) for BasicHours

alter table orders 
alter  column CleanBasicHours decimal(7,2) not null 
David Fawzy
sumber
3

Kendala drop pertama

https://stackoverflow.com/a/49393045/2547164

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

Kedua, buat nilai default

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]
Mise
sumber
2

Coba ikuti perintah;

ALTER TABLE Person11
ADD CONSTRAINT col_1_def
DEFAULT 'This is not NULL' FOR Address
Hasna Ashraf
sumber
1

Seperti jawaban Yuck dengan tanda centang untuk memungkinkan skrip dijalankan lebih dari sekali tanpa kesalahan. (lebih sedikit kode / string khusus daripada menggunakan information_schema.columns)

IF object_id('DF_SomeName', 'D') IS NULL BEGIN
    Print 'Creating Constraint DF_SomeName'
   ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
END
ScottFoster1000
sumber