Thay đổi cột, thêm ràng buộc mặc định


185

Tôi có một bảng và một trong các cột là "Ngày" của kiểu thời gian. Chúng tôi đã quyết định thêm một ràng buộc mặc định cho cột đó

Alter table TableName
alter column dbo.TableName.Date default getutcdate() 

nhưng điều này cho tôi lỗi:

Cú pháp không chính xác gần '.'

Có ai thấy bất cứ điều gì rõ ràng sai ở đây, mà tôi đang thiếu (ngoài việc có một tên tốt hơn cho cột)


11
Đừng sử dụng các loại hoặc từ khóa làm tên cột!
JonH

8
yup, đã đồng ý - "Có ai thấy bất cứ điều gì rõ ràng sai ở đây, mà tôi đang thiếu (ngoài việc có một tên tốt hơn cho cột)"
ram

Câu trả lời:


349

Thử cái này

alter table TableName 
 add constraint df_ConstraintNAme 
 default getutcdate() for [Date]

thí dụ

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

đồng thời đảm bảo rằng bạn đặt tên cho ràng buộc mặc định..tôi sẽ bị đau cổ để bỏ nó sau vì nó sẽ có một trong những tên được tạo bởi hệ thống điên rồ đó ... xem thêm Cách đặt tên ràng buộc mặc định và cách bỏ ràng buộc mặc định mà không có Tên trong máy chủ SQL


7

bạn có thể gói các từ dành riêng trong ngoặc vuông để tránh các loại lỗi sau:

dbo.TableName.[Date]

1
Có vẻ như một ý tưởng thực sự tồi tệ khi sử dụng các từ dành riêng cho tên cột.
Norbert Norbertson

4
Có vẻ như, nhưng nó không phải là. Tôi sử dụng chúng thành công từ năm 2004 :)
Cătălin Rădoi

7

Tôi sử dụng quy trình được lưu trữ bên dưới để cập nhật mặc định trên một cột.

Nó tự động xóa mọi mặc định trước đó trên cột, trước khi thêm mặc định mới.

Ví dụ về việc sử dụng:

-- Update default to be a date.
exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','getdate()';
-- Update default to be a number.
exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column,'6';
-- Update default to be a string. Note extra quotes, as this is not a function.
exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','''MyString''';

Thủ tục lưu trữ:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- Sample function calls:
--exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','ColumnName','getdate()';
--exec [dbol].[AlterDefaultForColumn] '[dbo].[TableName]','Column,'6';
--exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','''MyString''';
create PROCEDURE [dbo].[ColumnDefaultUpdate]
    (
        -- Table name, including schema, e.g. '[dbo].[TableName]'
        @TABLE_NAME VARCHAR(100), 
        -- Column name, e.g. 'ColumnName'.
        @COLUMN_NAME VARCHAR(100),
        -- New default, e.g. '''MyDefault''' or 'getdate()'
        -- Note that if you want to set it to a string constant, the contents
        -- must be surrounded by extra quotes, e.g. '''MyConstant''' not 'MyConstant'
        @NEW_DEFAULT VARCHAR(100)
    )
AS 
BEGIN       
    -- Trim angle brackets so things work even if they are included.
    set @COLUMN_NAME = REPLACE(@COLUMN_NAME, '[', '')
    set @COLUMN_NAME = REPLACE(@COLUMN_NAME, ']', '')

    print 'Table name: ' + @TABLE_NAME;
    print 'Column name: ' + @COLUMN_NAME;
    DECLARE @ObjectName NVARCHAR(100)
    SELECT @ObjectName = OBJECT_NAME([default_object_id]) FROM SYS.COLUMNS
    WHERE [object_id] = OBJECT_ID(@TABLE_NAME) AND [name] = @COLUMN_NAME;

    IF @ObjectName <> '' 
    begin
        print 'Removed default: ' + @ObjectName;
        --print('ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @ObjectName)
        EXEC('ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @ObjectName)
    end

    EXEC('ALTER TABLE ' + @TABLE_NAME + ' ADD  DEFAULT (' + @NEW_DEFAULT + ') FOR ' + @COLUMN_NAME)
    --print('ALTER TABLE ' + @TABLE_NAME + ' ADD  DEFAULT (' + @NEW_DEFAULT + ') FOR ' + @COLUMN_NAME)
    print 'Added default of: ' + @NEW_DEFAULT;
END

Lỗi thủ tục lưu trữ này giúp loại bỏ

Nếu bạn cố gắng thêm một mặc định vào một cột khi một cột đã tồn tại, bạn sẽ gặp lỗi sau (một điều bạn sẽ không bao giờ thấy nếu sử dụng Proc được lưu trữ này):

-- Using the stored procedure eliminates this error:
Msg 1781, Level 16, State 1, Line 1
Column already has a DEFAULT bound to it.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.

5

Trên thực tế, bạn phải làm như bên dưới Ví dụ, điều này sẽ giúp giải quyết vấn đề ...

drop table ABC_table

create table ABC_table
(
    names varchar(20),
    age int
)

ALTER TABLE ABC_table
ADD CONSTRAINT MyConstraintName
DEFAULT 'This is not NULL' FOR names

insert into ABC(age) values(10)

select * from ABC

Cái này chỉ dùng để thực hành, không thể sử dụng trong thực tế
Trương Long

0

Bạn đang chỉ định tên bảng hai lần. Phần ALTER TABLE đặt tên cho bảng. Thử: Thay đổi bảng TableName thay đổi cột [Ngày] mặc định getutcdate ()


0

thay đổi bảng TableName ràng buộc thả DF_TableName_WhenNhập

thay đổi bảng TableName thêm ràng buộc DF_TableName_WhenNhập getutcdate mặc định () cho Khi được nhập


câu trả lời này cũng chứa truy vấn ràng buộc thả. Nếu ai đó đã thêm getdate () trước đó và bây giờ anh ta cần thay đổi nó thành getutcdate (). anh ta có thể nhận được sự giúp đỡ thông qua câu trả lời này. @RalfFriedl
Abhijit Poojari
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.