Cách đặt giá trị mặc định cho cột hiện có


375

Điều này không hoạt động trong SQL Server 2008:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

Lỗi là:

Cú pháp không chính xác gần từ khóa 'SET'.

Tôi đang làm gì sai?


1
Bạn đã đọc MSDN ALTER TABLE nói gì ...? msdn.microsoft.com/en-us/l Library / ms187742 (MySQL.90) .aspx
gbn



1
Đó là cú pháp mysql.
Benjamin Goodacre

Tại sao mọi người không thể chỉ tuân theo một tiêu chuẩn? (không phải là một câu hỏi thực sự, tất cả mọi người đề cập đến microsoft và mysql hoặc các nhà cung cấp khác). thậm chí có một cách tiêu chuẩn ansi / iso để làm điều này?
joedotnot

Câu trả lời:


566

Điều này sẽ hoạt động trong SQL Server:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;

62
+1 để chỉ định tên ràng buộc, vì vậy SQL Server không tạo một tên ngẫu nhiên.
HardCode

36
MSSQL là lạ khi gọi các giá trị mặc định là "các ràng buộc". Nếu bất cứ điều gì, họ là thư giãn ; sự đối lập của một ràng buộc! Họ làm cho nhiều thứ hợp lệ hơn, không ít hơn.
Roman Starkov

4
Sẽ không có gì lạ nếu bạn nghĩ theo một cách khác như: Ràng buộc mặc định ngăn MSSQL gây ra lỗi nếu bạn không chỉ định cột. Vì vậy, nó không phải là một ràng buộc đối với người dùng, mà là một ràng buộc đối với MSSQL.
Jonny Piazzi

4
Điều này chỉ hoạt động nếu không có ràng buộc mặc định hiện có trên cột.
pmcilreavy

4
@fallenidol Điều này chỉ hoạt động nếu không có ràng buộc mặc định hiện có trên cột. Đúng, bởi vì theo định nghĩa, bạn không thể có nhiều hơn một giá trị mặc định ...
Yuck

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
Điều này hoạt động trong MSSQL, nhưng nó có nhược điểm là nó không đặt tên cho ràng buộc mà nó tạo ra đằng sau hậu trường (xem câu trả lời được bình chọn cao hơn ở trên).
Contango

10
@Contango Tôi nghĩ tốt hơn hết là đừng bận tâm đến việc đặt tên cho mọi ràng buộc duy nhất đối với sự bất đồng mà bạn cần phải sửa đổi một trong số chúng. Chỉ cần viết một thủ tục để loại bỏ các ràng buộc được đặt tên tự động và bạn không bao giờ phải đặt tên một lần nữa + có thể xử lý tất cả các ràng buộc không tên khác
JonnyRaa

3
@Jonny Leeds. Điểm tốt. Tôi cũng muốn đặt tên cho các ràng buộc, vì đó là tài liệu tốt cho bất kỳ ai khác đang cố gắng sửa đổi (hoặc hiểu đơn giản) lược đồ cơ sở dữ liệu. Điều này ít quan trọng hơn nếu một người là người điều hành solo làm việc trong một nhóm.
Contango

1
(EESH! Xin lỗi về việc thiếu nguồn cấp dữ liệu - được dán bên dưới cho rõ ràng!) Tôi cần nó có thể chạy lại được và tìm cách này để kiểm tra xem nó đã được thực hiện chưa ... NẾU EXISTS (CHỌN * TỪ information_schema.columns WHERE table_name = 'myTable' VÀ column_name = 'myColumn' VÀ Table_schema = 'myDBO' VÀ column_default IS NULL) BEGIN ALTER TABLE [myDBO] [myTable] Thanh DEFAULT 0 CHO [myColumn] END.
Dave

4
Nếu chỉ có một ràng buộc mặc định ... tại sao bạn phải đặt tên cho nó? Có vẻ như các công cụ cơ sở dữ liệu khác cung cấp cú pháp để thêm, cập nhật, xóa giá trị mặc định cho một cột mà không có bất kỳ tên nào ngoài tên cột, điều này có ý nghĩa. Mã trên không thành công, btw, nếu một mặc định đã tồn tại. Thật nực cười khi SQL Server yêu cầu một phép nối phức tạp với bảng hệ thống chỉ để xác định tên của ràng buộc mặc định, điều này không cần thiết bởi vì chỉ có một ràng buộc mặc định trên một cột.
Triynko

51

không thể sử dụng cột thay đổi cho điều đó, sử dụng thêm thay thế

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn

9
không biết tại sao câu trả lời này không nhận được sự ủng hộ. Nó giống hệt như lần trước và đã được trả lời trước đó ...
spankmaster79

30

Cách chính xác để làm điều này là như sau:

  1. Chạy lệnh:

    sp_help [table name] 
  2. Sao chép tên của CONSTRAINT.

  3. Thả DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. Chạy lệnh dưới đây:

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]

4
StackOverflow.com chỉ có ngôn ngữ tiếng Anh. Trang web tiếng Bồ Đào Nha là pt.stackoverflow.com
Martin Smith

Điều này không thêm gì mới vào các câu trả lời khác, là một phương pháp thủ công - không thể viết thành kịch bản và được nêu là "cách chính xác" ..
Andre Figueiredo

12

Giải pháp của Hoodaticus là hoàn hảo, cảm ơn bạn, nhưng tôi cũng cần nó để có thể chạy lại được và tìm cách này để kiểm tra xem nó đã được thực hiện chưa ...

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

7

Có hai kịch bản có thể thay đổi giá trị mặc định cho một cột,

  1. Tại thời điểm tạo bảng
  2. Sửa đổi cột hiện có cho một bảng hiện có.

  1. Tại thời điểm tạo bảng / tạo cột mới.

Truy vấn

create table table_name
(
    column_name datatype default 'any default value'
);
  1. Sửa đổi cột hiện có cho một bảng hiện có

Trong trường hợp này, máy chủ SQL của tôi không cho phép sửa đổi giá trị ràng buộc mặc định hiện có. Vì vậy, để thay đổi giá trị mặc định, chúng ta cần xóa ràng buộc mặc định do hệ thống tạo hoặc do người dùng tạo. Và sau đó giá trị mặc định có thể được đặt cho một cột cụ thể.

Thực hiện theo một số bước:

  1. Liệt kê tất cả các ràng buộc giá trị mặc định hiện có cho các cột.

Thực hiện thủ tục cơ sở dữ liệu hệ thống này, nó lấy tên bảng làm tham số. Nó trả về danh sách tất cả các ràng buộc cho tất cả các cột trong bảng.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. Thả các ràng buộc mặc định hiện có cho một cột.

Cú pháp:

alter table 'table_name' drop constraint 'constraint_name'
  1. Thêm ràng buộc giá trị mặc định mới cho cột đó:

Cú pháp:

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

chúc mừng @ !!!


5

trong trường hợp hạn chế đã tồn tại với tên mặc định của nó:

-- 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;

4
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]

4

Bạn có thể sử dụng cú pháp sau, Để biết thêm thông tin, hãy xem câu hỏi và câu trả lời này: Thêm một cột có giá trị mặc định vào bảng hiện có trong SQL Server

Cú pháp:

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

Thí dụ :

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.

Cách khác :

Nhấp chuột phải vào bảng và nhấp vào Thiết kế, sau đó nhấp vào cột mà bạn muốn đặt giá trị mặc định.

Sau đó, ở dưới cùng của trang thêm một giá trị mặc định hoặc ràng buộc: một cái gì đó như '1' cho chuỗi hoặc 1 cho int.


3

Chỉ tìm thấy 3 bước đơn giản để thay đổi cột đã tồn tại trước đó là null

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 

3

Hạn chế thả đầu tiên

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)

Thứ hai tạo giá trị mặc định

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

2

Hãy thử làm theo lệnh;

ALTER TABLE Person11
ADD CONSTRAINT col_1_def
DEFAULT 'This is not NULL' FOR Address

1

Giống như câu trả lời của Yuck với một kiểm tra để cho phép tập lệnh được chạy nhiều lần mà không gặp lỗi. (ít mã / chuỗi tùy chỉnh hơn so với sử dụng 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.