จะลบคอลัมน์ออกจากตารางที่มีอยู่ได้อย่างไร
ฉันมีโต๊ะMEN
พร้อมFname
และLname
ฉันต้องการลบ Lname
ทำอย่างไร?
จะลบคอลัมน์ออกจากตารางที่มีอยู่ได้อย่างไร
ฉันมีโต๊ะMEN
พร้อมFname
และLname
ฉันต้องการลบ Lname
ทำอย่างไร?
คำตอบ:
ALTER TABLE MEN DROP COLUMN Lname
สามัญ:
ALTER TABLE table_name DROP COLUMN column_name;
ในกรณีของคุณ:
ALTER TABLE MEN DROP COLUMN Lname;
ตัวอย่างของคุณง่ายและไม่ต้องการการเปลี่ยนแปลงตารางเพิ่มเติม แต่โดยทั่วไปแล้วการพูดแบบนี้มันไม่สำคัญเลย
หากมีการอ้างอิงคอลัมน์นี้โดยตารางอื่น ๆ คุณต้องคิดว่าจะทำอย่างไรกับตาราง / คอลัมน์อื่น ๆ ทางเลือกหนึ่งคือการลบกุญแจต่างประเทศและเก็บข้อมูลอ้างอิงในตารางอื่น ๆ
อีกทางเลือกหนึ่งคือค้นหาคอลัมน์การอ้างอิงทั้งหมดและลบออกด้วยหากไม่ต้องการอีกต่อไป
ในกรณีเช่นนี้ความท้าทายที่แท้จริงคือการหากุญแจต่างประเทศทั้งหมด คุณสามารถทำได้โดยการสอบถามตารางระบบหรือใช้เครื่องมือของบุคคลที่สามเช่นApexSQL Search (ฟรี) หรือตัวติดตาม Red Gate Dependency (คุณสมบัติพิเศษ แต่มีมากกว่า) มีกระทู้ทั้งหมดเกี่ยวกับกุญแจต่างประเทศที่นี่
นี่คือคำตอบที่ถูกต้อง:
ALTER TABLE MEN DROP COLUMN Lname
แต่ ... ถ้าCONSTRAINT
อยู่บนCOLUMN
แล้วคุณจะต้องแรกแล้วคุณจะสามารถที่จะ เพื่อที่จะวาง a , run:DROP
CONSTRAINT
DROP
COLUMN
CONSTRAINT
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
สำหรับคอลัมน์ ?
ในSQL Server 2016คุณสามารถใช้คำสั่ง DIE ใหม่
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
แบบสอบถามด้านบนสามารถเรียกใช้ซ้ำได้หากdrops
เป็นคอลัมน์exists
ในตารางอื่นมันจะไม่เกิดข้อผิดพลาด
แทนที่จะใช้แผ่นปิดขนาดใหญ่IF
เพื่อตรวจสอบการมีอยู่ของcolumn
ก่อนที่จะวางคุณสามารถเรียกใช้DDL
คำสั่งด้านบน
คำถามคือคุณสามารถลบคอลัมน์ได้จากตารางที่ไม่มีอยู่ ;-)
BEGIN TRANSACTION
IF exists (SELECT * FROM sys.columns c
INNER JOIN sys.objects t ON (c.[object_id] = t.[object_id])
WHERE t.[object_id] = OBJECT_ID(N'[dbo].[MyTable]')
AND c.[name] = 'ColumnName')
BEGIN TRY
ALTER TABLE [dbo].[MyTable] DROP COLUMN ColumnName
END TRY
BEGIN CATCH
print 'FAILED!'
END CATCH
ELSE
BEGIN
SELECT ERROR_NUMBER() AS ErrorNumber;
print 'NO TABLE OR COLUMN FOUND !'
END
COMMIT
คำตอบง่ายๆนี้คือการใช้สิ่งนี้:
ALTER TABLE MEN DROP COLUMN Lname;
สามารถระบุได้มากกว่าหนึ่งคอลัมน์ดังนี้:
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
จาก SQL Server 2016 เป็นไปได้ที่จะทิ้งเฉพาะคอลัมน์ที่มีอยู่เท่านั้น สิ่งนี้จะหยุดคุณได้รับข้อผิดพลาดเมื่อไม่มีคอลัมน์ซึ่งเป็นสิ่งที่คุณอาจไม่สนใจ
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
มีข้อกำหนดเบื้องต้นบางประการสำหรับการวางคอลัมน์ คอลัมน์ที่ลดลงไม่สามารถเป็น:
หากข้อใดข้อหนึ่งข้างต้นเป็นจริงคุณต้องยกเลิกการเชื่อมโยงเหล่านั้นก่อน
นอกจากนี้ควรสังเกตว่าการวางคอลัมน์จะไม่เรียกคืนพื้นที่จากฮาร์ดดิสก์จนกว่าดัชนีคลัสเตอร์ของตารางจะถูกสร้างใหม่ ดังนั้นจึงเป็นความคิดที่ดีที่จะปฏิบัติตามข้างต้นด้วยคำสั่งสร้างตารางเช่นนี้:
ALTER TABLE MEN REBUILD;
ในที่สุดก็มีบางคนบอกว่านี่อาจจะช้าและอาจจะล็อคตารางในช่วงระยะเวลา เป็นไปได้ที่จะสร้างตารางใหม่ด้วยโครงสร้างที่ต้องการแล้วเปลี่ยนชื่อดังนี้
SELECT
Fname
-- Note LName the column not wanted is not selected
INTO
new_MEN
FROM
MEN;
EXEC sp_rename 'MEN', 'old_MEN';
EXEC sp_rename 'new_MEN', 'MEN';
DROP TABLE old_MEN;
แต่ได้รับคำเตือนว่าจะมีหน้าต่างสำหรับการสูญเสียข้อมูลของแถวที่แทรกที่นี่ระหว่างตัวเลือกแรกและคำสั่งเปลี่ยนชื่อล่าสุด
ในการเพิ่มคอลัมน์ในตารางที่มีอยู่:
ALTER TABLE table_name
ADD
column_name DATATYPE NULL
วิธีลบคอลัมน์ในตารางที่มีอยู่:
ALTER TABLE table_name
DROP COLUMN column_name
สิ่งนี้สามารถทำได้ผ่าน SSMS GUI สิ่งที่ดีเกี่ยวกับวิธีนี้คือมันจะเตือนคุณหากมีความสัมพันธ์ใด ๆ ในคอลัมน์นั้นและยังสามารถลบสิ่งเหล่านั้นโดยอัตโนมัติเช่นกัน
ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้หากมีความสัมพันธ์ใด ๆ ที่จะต้องถูกลบไปด้วยมันจะถามคุณ ณ จุดนี้หากคุณต้องการลบสิ่งเหล่านั้นด้วย คุณอาจจะต้องทำการลบคอลัมน์
หากคุณใช้ C # และคอลัมน์ Identity เป็น int ให้สร้างอินสแตนซ์ใหม่ของ int โดยไม่ต้องให้คุณค่าใด ๆ กับมันมันทำงานได้ดีสำหรับฉัน
[identity_column] = new int ()
ไวยากรณ์:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
ตัวอย่างเช่น:
alter table Employee drop column address;