ฉันจะเพิ่มคอลัมน์ที่มีค่าเริ่มต้นให้กับตารางที่มีอยู่ในSQL Server 2000 / SQL Server 2005 ได้อย่างไร
ฉันจะเพิ่มคอลัมน์ที่มีค่าเริ่มต้นให้กับตารางที่มีอยู่ในSQL Server 2000 / SQL Server 2005 ได้อย่างไร
คำตอบ:
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.
ชื่อข้อ จำกัด เพิ่มเติม:
หากคุณไม่อยู่ที่อื่นCONSTRAINT D_SomeTable_SomeCol
SQL Server จะสร้างข้อ จำกัด
เริ่มต้นโดยอัตโนมัติด้วยชื่อตลกเช่น:DF__SomeTa__SomeC__4FB7FEF6
ตัวเลือกที่มีค่างบ:เป็นสิ่งจำเป็นเฉพาะเมื่อคอลัมน์ของคุณ Nullable
และคุณต้องการเริ่มต้นราคาที่มีอยู่ใช้สำหรับประวัติ
หากคอลัมน์ของคุณคือมันจะใช้ค่าเริ่มต้น
สำหรับระเบียนที่มีอยู่ทั้งหมดโดยอัตโนมัติไม่ว่าคุณจะระบุหรือไม่ก็ตามWITH VALUES
NOT NULL
WITH VALUES
วิธีการทำงานแทรกด้วยการเริ่มต้น- จำกัด :
ถ้าคุณใส่ลงในบันทึกSomeTable
และไม่ได้ระบุSomeCol
's 0
คุ้มค่าแล้วมันจะเริ่มต้น
หากคุณแทรกระเบียนและระบุSomeCol
ค่าของเป็นNULL
(และคอลัมน์ของคุณอนุญาตเป็นโมฆะ)
ดังนั้นข้อ จำกัด เริ่มต้นจะไม่ถูกใช้และNULL
จะถูกแทรกเป็นค่า
หมายเหตุมาจากคำติชมที่ดีของทุกคนด้านล่าง
ขอขอบคุณเป็นพิเศษถึง:
@Yatrix, @WalterStabosz, @YahooSerious และ @StackMan สำหรับความคิดเห็นของพวกเขา
NOT NULL
นั่นคือความจริงเท่านั้นถ้าคอลัมน์ที่เป็น โปรดลองนี้create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah;
คุณจะเห็น 2 b
ค่าเป็นศูนย์สำหรับคอลัมน์
WITH VALUES
เพื่ออัปเดตแถว nullable ที่มีอยู่ ดูMSDN : "ถ้าคอลัมน์เพิ่มอนุญาตให้มีค่า Null และWITH VALUES
ระบุไว้ค่าเริ่มต้นจะถูกเก็บไว้ในคอลัมน์ใหม่เพิ่มในแถวที่มีอยู่"
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
การรวมค่าเริ่มต้นเติมคอลัมน์ในแถวที่มีอยู่ด้วยค่าเริ่มต้นดังนั้นข้อ จำกัด NOT NULL จึงไม่ถูกละเมิด
เมื่อเพิ่มคอลัมน์ที่ไม่WITH VALUES
สามารถใช้ได้จะทำให้แน่ใจว่าค่า DEFAULT ที่เฉพาะเจาะจงถูกนำไปใช้กับแถวที่มีอยู่:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
DEFAULT
ข้อ จำกัด จะมีค่าอยู่เสมอนั่นคือไม่ใช่ NULL แม้ว่าNOT NULL
จะไม่ได้ระบุก็ตาม
BIT
ประเภทข้อมูลที่ผมได้พูดคุยเกี่ยวกับเรื่องนี้โดยเฉพาะอย่างยิ่งคอลัมน์BIT
NOT NULL
ดูคำตอบที่คอลัมน์ถูกประกาศให้เป็น
ALTER TABLE <table name>
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name>
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO
ระวังเมื่อคอลัมน์ที่คุณเพิ่มมีNOT NULL
ข้อ จำกัด แต่ไม่มีDEFAULT
ข้อ จำกัด (ค่า) ALTER TABLE
คำสั่งจะล้มเหลวในกรณีที่ว่าถ้าตารางมีแถวใด ๆ อยู่ในนั้น วิธีแก้ไขคือลบNOT NULL
ข้อ จำกัด ออกจากคอลัมน์ใหม่หรือกำหนดDEFAULT
ข้อ จำกัด
รุ่นพื้นฐานที่สุดที่มีสองบรรทัดเท่านั้น
ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
ใช้:
-- Add a column with a default DateTime
-- to capture when each record is added.
ALTER TABLE myTableName
ADD RecordAddedDate SMALLDATETIME NULL DEFAULT (GETDATE())
GO
หากคุณต้องการเพิ่มหลายคอลัมน์คุณสามารถทำได้เช่น:
ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO
ใช้:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
การอ้างอิง: ALTER TABLE (Transact-SQL) (MSDN)
ในการเพิ่มคอลัมน์ในตารางฐานข้อมูลที่มีอยู่ด้วยค่าเริ่มต้นเราสามารถใช้:
ALTER TABLE [dbo.table_name]
ADD [Column_Name] BIT NOT NULL
Default ( 0 )
นี่เป็นอีกวิธีในการเพิ่มคอลัมน์ในตารางฐานข้อมูลที่มีอยู่ด้วยค่าเริ่มต้น
สคริปต์ SQL ที่ละเอียดมากยิ่งขึ้นเพื่อเพิ่มคอลัมน์ที่มีค่าเริ่มต้นอยู่ด้านล่างรวมถึงการตรวจสอบว่ามีคอลัมน์อยู่ก่อนที่จะเพิ่มหรือไม่ก็ตรวจสอบข้อ จำกัด และวางลงหากมี สคริปต์นี้ยังตั้งชื่อข้อ จำกัด เพื่อให้เรามีรูปแบบการตั้งชื่อที่ดี (ฉันชอบ DF_) และหากไม่ใช่ SQL จะทำให้เรามีข้อ จำกัด ด้วยชื่อที่มีหมายเลขที่สร้างแบบสุ่ม ดังนั้นจึงเป็นเรื่องดีที่สามารถตั้งชื่อข้อ จำกัด ได้เช่นกัน
-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
IF EXISTS ( SELECT 1
FROM sys.default_constraints
WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
)
BEGIN
------ DROP Contraint
ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
END
-- ----- DROP Column -----------------------------------------------------------------
ALTER TABLE [dbo].table_Emplyee
DROP COLUMN Column_EmployeeName
PRINT 'Column Column_EmployeeName in images table was dropped'
END
--------------------------------------------------------------------------
-- ADD COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
----- ADD Column & Contraint
ALTER TABLE dbo.table_Emplyee
ADD Column_EmployeeName BIT NOT NULL
CONSTRAINT [DF_table_Emplyee_Column_EmployeeName] DEFAULT (0)
PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
END
GO
นี่คือสองวิธีในการเพิ่มคอลัมน์ในตารางฐานข้อมูลที่มีอยู่ด้วยค่าเริ่มต้น
คุณสามารถทำสิ่งนี้กับ T-SQL ได้ด้วยวิธีต่อไปนี้
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
เช่นเดียวกับที่คุณสามารถใช้SQL Server Management Studioได้โดยคลิกขวาที่ตารางในเมนูออกแบบตั้งค่าเริ่มต้นเป็นตาราง
นอกจากนี้หากคุณต้องการเพิ่มคอลัมน์เดียวกัน (หากไม่มีอยู่) ในตารางทั้งหมดในฐานข้อมูลให้ใช้:
USE AdventureWorks;
EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
ใน SQL Server 2008-R2 ฉันไปที่โหมดการออกแบบ - ในฐานข้อมูลทดสอบ - และเพิ่มคอลัมน์สองคอลัมน์ของฉันโดยใช้ผู้ออกแบบและทำการตั้งค่าด้วย GUI จากนั้นคนที่น่าอับอายRight-Clickก็มีตัวเลือก " สร้างสคริปต์การเปลี่ยนแปลง "!
คุณก็เดาได้ว่าสคริปต์การเปลี่ยนแปลงที่มีการจัดรูปแบบที่เหมาะสมและรับประกันการทำงาน กดปุ่มง่าย
หรือคุณสามารถเพิ่มค่าเริ่มต้นโดยไม่ต้องตั้งชื่อข้อ จำกัด อย่างชัดเจน:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
หากคุณมีปัญหากับข้อ จำกัด เริ่มต้นที่มีอยู่เมื่อสร้างข้อ จำกัด นี้คุณสามารถลบได้โดย:
alter table [schema].[tablename] drop constraint [constraintname]
สิ่งนี้สามารถทำได้ใน SSMS GUI เช่นกัน ฉันแสดงวันที่เริ่มต้นด้านล่าง แต่ค่าเริ่มต้นอาจเป็นอะไรก็ได้แน่นอน
(getdate())
หรือabc
หรือ0
ค่าใด ๆ ที่คุณต้องการในค่าเริ่มต้นหรือเขตข้อมูลที่มีผลผูกพันตามภาพด้านล่าง:ALTER TABLE ADD ColumnName {Column_Type} Constraint
บทความ MSDN เปลี่ยนแปลงตาราง (Transact-SQL)มีไวยากรณ์ตารางการเปลี่ยนแปลงทั้งหมด
ตัวอย่าง:
ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
ตัวอย่าง:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
สร้างโต๊ะด้วยชื่อนักเรียนก่อน:
CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
เพิ่มหนึ่งคอลัมน์ลงไป:
ALTER TABLE STUDENT
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)
SELECT *
FROM STUDENT
ตารางถูกสร้างขึ้นและคอลัมน์จะถูกเพิ่มในตารางที่มีอยู่ด้วยค่าเริ่มต้น
มีคำตอบมากมาย แต่ฉันรู้สึกว่าต้องเพิ่มวิธีการเพิ่มเติมนี้ ดูเหมือนจะนานกว่านี้ แต่มีประโยชน์อย่างมากหากคุณเพิ่มเขตข้อมูล NULL ลงในตารางที่มีแถวนับล้านแถวในฐานข้อมูลที่ใช้งานอยู่
ALTER TABLE {schemaName}.{tableName}
ADD {columnName} {datatype} NULL
CONSTRAINT {constraintName} DEFAULT {DefaultValue}
UPDATE {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
ALTER TABLE {schemaName}.{tableName}
ALTER COLUMN {columnName} {datatype} NOT NULL
สิ่งนี้จะทำคือเพิ่มคอลัมน์เป็นเขตข้อมูล null และด้วยค่าเริ่มต้นปรับปรุงเขตข้อมูลทั้งหมดเป็นค่าเริ่มต้น (หรือคุณสามารถกำหนดค่าที่มีความหมายเพิ่มเติม) และในที่สุดมันจะเปลี่ยนคอลัมน์เป็นไม่เป็นโมฆะ
เหตุผลนี้คือถ้าคุณอัปเดตตารางขนาดใหญ่และเพิ่มเขตข้อมูลใหม่ที่ไม่ใช่ค่าว่างจะต้องเขียนไปยังทุกแถวเดียวและในที่นี้จะล็อคตารางทั้งหมดเนื่องจากจะเพิ่มคอลัมน์แล้วเขียนค่าทั้งหมด
วิธีนี้จะเพิ่มคอลัมน์ nullable ที่ทำงานเร็วขึ้นมากแล้วกรอกข้อมูลก่อนที่จะตั้งค่าสถานะไม่ null
ฉันพบว่าการทำสิ่งทั้งหมดในคำสั่งเดียวจะล็อกตารางที่ใช้งานของเราให้มากขึ้นเป็นเวลา 4-8 นาทีและบ่อยครั้งที่ฉันได้ฆ่ากระบวนการ วิธีนี้แต่ละส่วนมักใช้เวลาเพียงไม่กี่วินาทีและทำให้เกิดการล็อคน้อยที่สุด
นอกจากนี้หากคุณมีตารางในส่วนของพันล้านแถวมันอาจคุ้มค่าที่จะทำการอัพเดทเช่นกัน:
WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END
ลองสิ่งนี้
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
SQL Server + แก้ไขตาราง + เพิ่มคอลัมน์ + ตัวระบุที่ไม่ซ้ำกันของค่าเริ่มต้น
ALTER TABLE Product
ADD ReferenceID uniqueidentifier not null
default (cast(cast(0 as binary) as uniqueidentifier))
IF NOT EXISTS (
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END
NOT EXISTS
ตรวจสอบก่อนที่จะพยายามปรับเปลี่ยนตาราง ทางออกที่ดีมาก ความเห็นเพิ่มเติมเกี่ยวกับวิธีการทำงานนี้จะทำให้มีประโยชน์มากยิ่งขึ้น
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
เพิ่มคอลัมน์ใหม่ไปยังตาราง:
ALTER TABLE [table]
ADD Column1 Datatype
ตัวอย่างเช่น,
ALTER TABLE [test]
ADD ID Int
หากผู้ใช้ต้องการทำให้เพิ่มขึ้นอัตโนมัติ:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
นี่สำหรับ SQL Server:
ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES
ตัวอย่าง:
ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES
หากคุณต้องการเพิ่มข้อ จำกัด แล้ว:
ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
ซึ่งสามารถทำได้โดยรหัสด้านล่าง
CREATE TABLE TestTable
(FirstCol INT NOT NULL)
GO
------------------------------
-- Option 1
------------------------------
-- Adding New Column
ALTER TABLE TestTable
ADD SecondCol INT
GO
-- Updating it with Default
UPDATE TestTable
SET SecondCol = 0
GO
-- Alter
ALTER TABLE TestTable
ALTER COLUMN SecondCol INT NOT NULL
GO
ลองด้วยแบบสอบถามด้านล่าง:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
จะเป็นการเพิ่มคอลัมน์ใหม่ลงในตาราง
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
จากแบบสอบถามนี้คุณสามารถเพิ่มคอลัมน์ของประเภทข้อมูลจำนวนเต็มด้วยค่าเริ่มต้น 0
ตอนนี้ฉันมีการดัดแปลงคำตอบก่อนหน้าของฉัน IF NOT EXISTS
ฉันได้สังเกตเห็นว่าไม่มีคำตอบดังกล่าว ดังนั้นฉันจะให้ทางออกใหม่ของมันเพราะฉันประสบปัญหาบางอย่างในการปรับเปลี่ยนตาราง
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO
นี่TaskSheet
คือชื่อตารางเฉพาะและIsBilledToClient
เป็นคอลัมน์ใหม่ที่คุณจะแทรกและ1
ค่าเริ่มต้น ซึ่งหมายความว่าในคอลัมน์ใหม่สิ่งที่จะเป็นค่าของแถวที่มีอยู่ดังนั้นจะมีการตั้งค่าโดยอัตโนมัติ อย่างไรก็ตามคุณสามารถเปลี่ยนแปลงได้ตามที่คุณต้องการด้วยความเคารพประเภทคอลัมน์เช่นฉันได้ใช้BIT
ดังนั้นฉันใส่ค่าเริ่มต้น 1
ฉันแนะนำระบบด้านบนเพราะฉันประสบปัญหา แล้วปัญหาคืออะไร ปัญหาคือถ้าIsBilledToClient
คอลัมน์มีอยู่ในตารางตารางแล้วถ้าคุณดำเนินการเฉพาะส่วนของรหัสที่ระบุด้านล่างคุณจะเห็นข้อผิดพลาดในตัวสร้างแบบสอบถามเซิร์ฟเวอร์ SQL แต่ถ้ามันไม่มีอยู่เป็นครั้งแรกจะไม่มีข้อผิดพลาดเมื่อดำเนินการ
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]