จะลบคอลัมน์ออกจากตารางที่มีอยู่ได้อย่างไร


386

จะลบคอลัมน์ออกจากตารางที่มีอยู่ได้อย่างไร

ฉันมีโต๊ะMENพร้อมFnameและLname

ฉันต้องการลบ Lname

ทำอย่างไร?


12
อาจเป็นไปได้ซ้ำกับการลบคอลัมน์ใน MS SQL Server 2005
rene

1
ซ้ำซ้อนที่เป็นไปได้ของการลบคอลัมน์ใน MS SQL Server
ฉันเป็นคนที่โง่ที่สุด

คำตอบ:




72

ตัวอย่างของคุณง่ายและไม่ต้องการการเปลี่ยนแปลงตารางเพิ่มเติม แต่โดยทั่วไปแล้วการพูดแบบนี้มันไม่สำคัญเลย

หากมีการอ้างอิงคอลัมน์นี้โดยตารางอื่น ๆ คุณต้องคิดว่าจะทำอย่างไรกับตาราง / คอลัมน์อื่น ๆ ทางเลือกหนึ่งคือการลบกุญแจต่างประเทศและเก็บข้อมูลอ้างอิงในตารางอื่น ๆ

อีกทางเลือกหนึ่งคือค้นหาคอลัมน์การอ้างอิงทั้งหมดและลบออกด้วยหากไม่ต้องการอีกต่อไป

ในกรณีเช่นนี้ความท้าทายที่แท้จริงคือการหากุญแจต่างประเทศทั้งหมด คุณสามารถทำได้โดยการสอบถามตารางระบบหรือใช้เครื่องมือของบุคคลที่สามเช่นApexSQL Search (ฟรี) หรือตัวติดตาม Red Gate Dependency (คุณสมบัติพิเศษ แต่มีมากกว่า) มีกระทู้ทั้งหมดเกี่ยวกับกุญแจต่างประเทศที่นี่


47

นี่คือคำตอบที่ถูกต้อง:

ALTER TABLE MEN DROP COLUMN Lname

แต่ ... ถ้าCONSTRAINTอยู่บนCOLUMNแล้วคุณจะต้องแรกแล้วคุณจะสามารถที่จะ เพื่อที่จะวาง a , run:DROPCONSTRAINTDROPCOLUMNCONSTRAINT

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

เปลี่ยนตาราง tb_name DROP KEY key_name
bortunac

3
HOW-TOค้นหาconstraintสำหรับคอลัมน์ ?
Kiquenet

21

ในSQL Server 2016คุณสามารถใช้คำสั่ง DIE ใหม่

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

แบบสอบถามด้านบนสามารถเรียกใช้ซ้ำได้หากdropsเป็นคอลัมน์existsในตารางอื่นมันจะไม่เกิดข้อผิดพลาด

แทนที่จะใช้แผ่นปิดขนาดใหญ่IFเพื่อตรวจสอบการมีอยู่ของcolumnก่อนที่จะวางคุณสามารถเรียกใช้DDLคำสั่งด้านบน


3
อะไรงบ DIE ?
Kiquenet

3
โดยวิธีการที่คุณสามารถเรียกสคริปต์ / ฟังก์ชั่น "re-runnable" เหล่านี้Idempotent
tomosius

4
นี่ควรเป็นคำตอบที่ยอมรับได้ หากคุณมีสคริปต์อัตโนมัติ sql ปรับใช้คุณต้องเขียนสคริปต์ของคุณอย่างนี้
ผู้ชนะ

7

คำถามคือคุณสามารถลบคอลัมน์ได้จากตารางที่ไม่มีอยู่ ;-)

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  

1
ผมคิดว่าถ้าคุณต้องการที่จะลดลงคอลัมน์จากตาราง unexisting การนี้จะเป็นวิธีที่จะทำมัน
Matiaan

6

คำตอบง่ายๆนี้คือการใช้สิ่งนี้:

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;

มีข้อกำหนดเบื้องต้นบางประการสำหรับการวางคอลัมน์ คอลัมน์ที่ลดลงไม่สามารถเป็น:

  • ใช้โดยดัชนี
  • ใช้โดยการตรวจสอบคีย์ต่างประเทศ UNIQUE หรือคีย์หลักข้อ จำกัด
  • เชื่อมโยงกับ DEFAULT
  • ผูกพันกับกฎ

หากข้อใดข้อหนึ่งข้างต้นเป็นจริงคุณต้องยกเลิกการเชื่อมโยงเหล่านั้นก่อน

นอกจากนี้ควรสังเกตว่าการวางคอลัมน์จะไม่เรียกคืนพื้นที่จากฮาร์ดดิสก์จนกว่าดัชนีคลัสเตอร์ของตารางจะถูกสร้างใหม่ ดังนั้นจึงเป็นความคิดที่ดีที่จะปฏิบัติตามข้างต้นด้วยคำสั่งสร้างตารางเช่นนี้:

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;

แต่ได้รับคำเตือนว่าจะมีหน้าต่างสำหรับการสูญเสียข้อมูลของแถวที่แทรกที่นี่ระหว่างตัวเลือกแรกและคำสั่งเปลี่ยนชื่อล่าสุด


2

ในการเพิ่มคอลัมน์ในตารางที่มีอยู่:

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

วิธีลบคอลัมน์ในตารางที่มีอยู่:

ALTER TABLE table_name
DROP COLUMN column_name

คำถามไม่เกี่ยวกับคอลัมน์เพิ่ม
Kiquenet

2

สิ่งนี้สามารถทำได้ผ่าน SSMS GUI สิ่งที่ดีเกี่ยวกับวิธีนี้คือมันจะเตือนคุณหากมีความสัมพันธ์ใด ๆ ในคอลัมน์นั้นและยังสามารถลบสิ่งเหล่านั้นโดยอัตโนมัติเช่นกัน

  1. วางตารางในมุมมองออกแบบ (คลิกขวาบนตาราง) ดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

  1. คลิกขวาที่คอลัมน์ในมุมมองออกแบบของตารางและคลิก "ลบคอลัมน์"

ป้อนคำอธิบายรูปภาพที่นี่

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


0

หากคุณใช้ C # และคอลัมน์ Identity เป็น int ให้สร้างอินสแตนซ์ใหม่ของ int โดยไม่ต้องให้คุณค่าใด ๆ กับมันมันทำงานได้ดีสำหรับฉัน

[identity_column] = new int ()


คำตอบนี้จะทำอะไร? มันจะลบคอลัมน์ออกจากตารางหรือไม่
Prashant Pimpale

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.