วิธีการตั้งค่าเริ่มต้นสำหรับคอลัมน์ที่มีอยู่


375

สิ่งนี้ไม่ทำงานใน SQL Server 2008:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

ข้อผิดพลาดคือ:

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

ผมทำอะไรผิดหรือเปล่า?


1
คุณอ่านอะไรใน MSDN ALTER TABLE พูดว่า ... ? msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
gbn



1
นั่นคือไวยากรณ์ของ MySQL
Benjamin Goodacre

ทำไมทุกคนถึงติดมาตรฐานไม่ได้? (ไม่ใช่คำถามจริงทุกคนอ้างถึง microsoft และ mysql หรือผู้จำหน่ายอื่น ๆ ) มีวิธี ansi / iso มาตรฐานในการทำเช่นนี้หรือไม่?
joedotnot

คำตอบ:


566

สิ่งนี้จะทำงานใน SQL Server:

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

62
+1 สำหรับการระบุชื่อข้อ จำกัด ดังนั้น SQL Server จะไม่สร้างชื่อแบบสุ่ม
HardCode

36
MSSQL นั้นแปลกสำหรับการเรียกค่า "จำกัด " ที่เป็นค่าเริ่มต้น หากมีสิ่งใดที่พวกเขาจะrelaxations ; ตรงข้ามของข้อ จำกัด ! พวกเขาทำให้สิ่งต่าง ๆ ที่ถูกต้องมากขึ้นไม่น้อยกว่า
Roman Starkov

4
จะไม่แปลกถ้าคุณคิดในทางเลือกเช่น: ข้อ จำกัด เริ่มต้นป้องกัน MSSQL ที่จะโยนข้อผิดพลาดหากคุณไม่ได้ระบุคอลัมน์ ดังนั้นจึงไม่ใช่ข้อ จำกัด สำหรับผู้ใช้ แต่เป็นข้อ จำกัด ของ MSSQL
Jonny Piazzi

4
ใช้ได้เฉพาะในกรณีที่ไม่มีข้อ จำกัด เริ่มต้นที่มีอยู่ในคอลัมน์
pmcilreavy

4
@fallenidol ใช้งานได้เฉพาะในกรณีที่ไม่มีข้อ จำกัด เริ่มต้นที่มีอยู่ในคอลัมน์ ถูกต้องเนื่องจากตามคำจำกัดความคุณไม่สามารถมีค่าเริ่มต้นได้มากกว่าหนึ่งค่า ...
Yuck

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
สิ่งนี้ใช้งานได้ใน MSSQL แต่มีข้อเสียเปรียบที่ไม่ได้ตั้งชื่อข้อ จำกัด ที่สร้างไว้เบื้องหลัง (ดูคำตอบที่โหวตไว้ข้างต้น)
Contango

10
@Contango ฉันคิดว่ามันจะดีกว่าที่จะไม่รบกวนการตั้งชื่อทุกข้อ จำกัด ใน offchance ที่คุณต้องการแก้ไขหนึ่งในนั้น เพียงเขียนโพรซีเดอร์สำหรับการปล่อยข้อ จำกัด ที่มีชื่อโดยอัตโนมัติและคุณไม่ต้องตั้งชื่ออีกต่อไป + สามารถจัดการกับสิ่งที่ไม่มีชื่ออื่น ๆ ได้
JonnyRaa

3
@ Jonny Leeds จุดดี. ฉันต้องการตั้งชื่อข้อ จำกัด ด้วยเนื่องจากเป็นเอกสารที่ดีสำหรับคนอื่นที่พยายามแก้ไข (หรือเพียงเข้าใจ) คีมาฐานข้อมูล สิ่งนี้สำคัญน้อยกว่าหากมีโอเปอเรเตอร์เดี่ยวที่ทำงานในทีมเดียว
Contango

1
(EESH! ขออภัยเกี่ยวกับการขาดตัวดึงข้อมูลบรรทัด - วางด้านล่างเพื่อความชัดเจน!) ฉันต้องการให้เรียกใช้อีกครั้งและพบวิธีนี้เพื่อตรวจสอบว่ามันถูกทำไปแล้วหรือยัง ... ถ้ามี (เลือก * จาก information_schema.columns table_name = 'myTable' AND column_name = 'myColumn' และ Table_schema = 'myDBO' และ column_default is NULL) เริ่มการเปลี่ยนแปลงตาราง [myDBO] [myTable] เพิ่มค่าเริ่มต้น 0 สำหรับ [myColumn] END
เดฟ

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

51

ไม่สามารถใช้คอลัมน์แก้ไขสำหรับสิ่งนั้นใช้เพิ่มแทน

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

9
ไม่ทราบสาเหตุที่คำตอบนี้ไม่ได้รับการโหวต เหมือนกับก่อนหน้านี้และได้รับคำตอบก่อนหน้านี้ ...
spankmaster79

30

วิธีที่ถูกต้องในการทำเช่นนี้มีดังนี้:

  1. เรียกใช้คำสั่ง:

    sp_help [table name] 
  2. CONSTRAINTคัดลอกชื่อของ

  3. วางDEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. เรียกใช้คำสั่งด้านล่าง:

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

4
StackOverflow.com เป็นภาษาอังกฤษเท่านั้น เว็บไซต์โปรตุเกสคือpt.stackoverflow.com
Martin Smith

นี้ไม่ได้เพิ่มอะไรใหม่ ๆ สำหรับคำตอบอื่น ๆ เป็นวิธีการด้วยตนเอง - ไม่สามารถเขียนสคริปต์และระบุว่าเป็น "วิธีที่ถูกต้อง" ..
Andre Figueiredo

12

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

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

มีสองสถานการณ์ที่ค่าเริ่มต้นสำหรับคอลัมน์สามารถเปลี่ยนแปลงได้

  1. ในช่วงเวลาของการสร้างตาราง
  2. ปรับเปลี่ยนคอลัมน์ที่มีอยู่สำหรับตารางที่มีอยู่

  1. ในช่วงเวลาของการสร้างตาราง / การสร้างคอลัมน์ใหม่

สอบถาม

create table table_name
(
    column_name datatype default 'any default value'
);
  1. ปรับเปลี่ยนคอลัมน์ที่มีอยู่สำหรับตารางที่มีอยู่

ในกรณีนี้เซิร์ฟเวอร์ SQL ของฉันไม่อนุญาตให้แก้ไขค่า จำกัด เริ่มต้นที่มีอยู่ ดังนั้นในการเปลี่ยนค่าเริ่มต้นเราจำเป็นต้องลบระบบที่มีอยู่ที่สร้างขึ้นหรือผู้ใช้สร้างข้อ จำกัด เริ่มต้น และหลังจากค่าเริ่มต้นนั้นสามารถกำหนดให้กับคอลัมน์ใดคอลัมน์หนึ่งได้

ทำตามขั้นตอนบางอย่าง:

  1. แสดงรายการข้อ จำกัด ค่าเริ่มต้นที่มีอยู่ทั้งหมดสำหรับคอลัมน์

ดำเนินการตามขั้นตอนฐานข้อมูลระบบนี้ใช้ชื่อตารางเป็นพารามิเตอร์ จะส่งคืนรายการข้อ จำกัด ทั้งหมดสำหรับคอลัมน์ทั้งหมดภายในตาราง

execute [dbo].[sp_helpconstraint] 'table_name'
  1. ปล่อยข้อ จำกัด เริ่มต้นที่มีอยู่สำหรับคอลัมน์

ไวยากรณ์:

alter table 'table_name' drop constraint 'constraint_name'
  1. เพิ่มข้อ จำกัด ค่าเริ่มต้นใหม่สำหรับคอลัมน์นั้น:

ไวยากรณ์:

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

ไชโย @ !!!


5

ในกรณีที่มีข้อ จำกัด อยู่แล้วด้วยชื่อเริ่มต้น:

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

คุณสามารถใช้ไวยากรณ์ต่อไปนี้สำหรับข้อมูลเพิ่มเติมดูคำถามและคำตอบนี้: เพิ่มคอลัมน์ที่มีค่าเริ่มต้นให้กับตารางที่มีอยู่ใน SQL Server

ไวยากรณ์:

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

ตัวอย่าง:

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.

อีกวิธีหนึ่ง:

คลิกขวาที่ตารางและคลิกที่ออกแบบจากนั้นคลิกที่คอลัมน์ที่คุณต้องการตั้งค่าเริ่มต้น

จากนั้นที่ด้านล่างของหน้าเพิ่มค่าเริ่มต้นหรือผูกพัน: สิ่งที่ต้องการ '1' สำหรับสตริงหรือ 1 สำหรับ int


3

เพิ่งค้นพบ 3 ขั้นตอนง่าย ๆ ในการแก้ไขคอลัมน์ที่มีอยู่แล้วซึ่งเป็นโมฆะก่อน

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

ข้อ จำกัด การปล่อยครั้งแรก

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)

สร้างค่าเริ่มต้นที่สอง

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


1

เช่นเดียวกับคำตอบของ Yuck พร้อมเช็คเพื่อให้สคริปต์สามารถรันได้มากกว่าหนึ่งครั้งโดยไม่มีข้อผิดพลาด (น้อยกว่าโค้ด / สตริงที่กำหนดเองกว่าการใช้ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.