เปลี่ยนคอลัมน์เพิ่มข้อ จำกัด เริ่มต้น


187

ฉันมีตารางและหนึ่งในคอลัมน์คือ "วันที่" ประเภทวันที่และเวลา เราตัดสินใจเพิ่มข้อ จำกัด เริ่มต้นในคอลัมน์นั้น

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

แต่สิ่งนี้ทำให้ฉันมีข้อผิดพลาด:

ไวยากรณ์ไม่ถูกต้องใกล้กับ '.'

ไม่มีใครเห็นอะไรผิดปกติอย่างชัดเจนที่นี่ซึ่งฉันหายไป (นอกจากชื่อคอลัมน์ที่ดีกว่า)


11
อย่าใช้ประเภทหรือคำหลักเป็นชื่อคอลัมน์!
JonH

8
yup, เห็นด้วย - "ไม่มีใครเห็นอะไรผิดปกติที่นี่ซึ่งฉันหายไป (นอกเหนือจากการมีชื่อที่ดีกว่าสำหรับคอลัมน์)"
ram

คำตอบ:


349

ลองสิ่งนี้

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

ตัวอย่าง

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณตั้งชื่อข้อ จำกัด เริ่มต้น .. มันจะเจ็บที่คอเพื่อวางไว้ในภายหลังเพราะมันจะมีหนึ่งในระบบที่บ้าเหล่านั้นสร้างชื่อ ... ดูเพิ่มเติมวิธีการตั้งชื่อข้อ จำกัด เริ่มต้นและวิธีการวางข้อ จำกัด เริ่มต้น ชื่อใน SQL Server


7

คุณสามารถห่อคำที่สงวนไว้ในวงเล็บเหลี่ยมเพื่อหลีกเลี่ยงข้อผิดพลาดประเภทนี้:

dbo.TableName.[Date]

1
ดูเหมือนว่าเป็นความคิดที่ไม่ดีจริงๆที่จะใช้คำสงวนสำหรับชื่อคอลัมน์
Norbert Norbertson

4
ดูเหมือนว่า แต่มันไม่ใช่ ผมใช้พวกเขาประสบความสำเร็จตั้งแต่ปี 2004 :)
CătălinRădoi

7

ฉันใช้กระบวนงานที่เก็บไว้ด้านล่างเพื่ออัปเดตค่าเริ่มต้นในคอลัมน์

มันจะลบค่าเริ่มต้นก่อนหน้าใด ๆ ในคอลัมน์โดยอัตโนมัติก่อนที่จะเพิ่มค่าเริ่มต้นใหม่

ตัวอย่างการใช้งาน:

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

ขั้นตอนการเก็บ:

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

ข้อผิดพลาดขั้นตอนการจัดเก็บนี้จะกำจัด

หากคุณพยายามที่จะเพิ่มค่าเริ่มต้นให้กับคอลัมน์เมื่อมีอยู่แล้วคุณจะได้รับข้อผิดพลาดต่อไปนี้ (สิ่งที่คุณจะไม่เห็นว่าใช้ proc ที่เก็บไว้นี้หรือไม่):

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

ที่จริงคุณต้องทำเช่นตัวอย่างด้านล่างซึ่งจะช่วยในการแก้ปัญหา ...

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

เพียงแค่นี้ก็ใช้สำหรับการปฏิบัติไม่สามารถใช้ในความเป็นจริง
Trươngยาว

0

คุณกำลังระบุชื่อตารางสองครั้ง ส่วนตารางแก้ไขชื่อตาราง ลอง: แก้ไขตารางชื่อตารางแก้ไขคอลัมน์ [วันที่] ค่าเริ่มต้น getutcdate ()


0

แก้ไขข้อ จำกัด การตกตาราง TableName DF_TableName_WhenEntered

เปลี่ยนตาราง TableName เพิ่มข้อ จำกัด DF_TableName_WhenEntered เริ่มต้น getutcdate () สำหรับ WhenEntered


คำตอบนี้มีแบบสอบถามแบบ จำกัด ข้อ จำกัด เช่นกันหากมีคนเพิ่ม getdate () ก่อนหน้านี้และตอนนี้เขาต้องการแก้ไขเป็น getutcdate () เขาอาจได้รับความช่วยเหลือผ่านคำตอบนี้ @RalfFriedl
Abhijit Poojari
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.