วิธีการเปลี่ยนลำดับคอลัมน์ในตารางโดยใช้แบบสอบถาม SQL ใน SQL Server 2005
ฉันต้องการจัดเรียงลำดับคอลัมน์ในตารางใหม่โดยใช้แบบสอบถาม SQL
วิธีการเปลี่ยนลำดับคอลัมน์ในตารางโดยใช้แบบสอบถาม SQL ใน SQL Server 2005
ฉันต้องการจัดเรียงลำดับคอลัมน์ในตารางใหม่โดยใช้แบบสอบถาม SQL
คำตอบ:
คุณไม่สามารถ. ลำดับคอลัมน์เป็นเพียง "เครื่องสำอาง" ที่มนุษย์เราสนใจ - สำหรับ SQL Server มันแทบจะไม่เกี่ยวข้องกันเลย
สิ่งที่สตูดิโอจัดการเซิร์ฟเวอร์ SQL ทำในพื้นหลังเมื่อคุณเปลี่ยนลำดับคอลัมน์มีการสร้างตารางใหม่ตั้งแต่ต้นด้วยCREATE TABLE
คำสั่งใหม่คัดลอกข้อมูลจากตารางเก่าจากนั้นจึงวางลง
ไม่มีคำสั่ง SQL เพื่อกำหนดการจัดลำดับคอลัมน์
INSERT
โดยไม่ระบุคอลัมน์ของคุณอย่างชัดเจนอีกต่อไป!
คุณต้องแสดงรายการฟิลด์ตามลำดับที่คุณต้องการให้ส่งคืนอย่างชัดเจนแทนที่จะใช้ * สำหรับคำสั่ง 'ค่าเริ่มต้น'
คำถามเดิม:
select * from foobar
ผลตอบแทน
foo bar
--- ---
1 2
ตอนนี้เขียน
select bar, foo from foobar
bar foo
--- ---
2 1
อ้างอิงจากhttp://msdn.microsoft.com/en-us/library/aa337556.aspx
งานนี้ไม่ได้รับการสนับสนุนโดยใช้คำสั่ง Transact-SQL
สามารถทำได้โดยใช้create
/ copy / drop
/ rename ตามที่komma8.komma1ตอบ
หรือคุณสามารถใช้ SQL Server Management Studio
- ในObject Explorerให้คลิกขวาที่ตารางที่มีคอลัมน์ที่คุณต้องการจัดลำดับใหม่แล้วคลิกออกแบบ (ปรับเปลี่ยนในเวอร์ชัน 2005 SP1 หรือรุ่นก่อนหน้า)
- เลือกช่องทางด้านซ้ายของชื่อคอลัมน์ที่คุณต้องการจัดลำดับใหม่ (คุณสามารถเลือกหลายคอลัมน์ได้โดยกดปุ่ม [shift] หรือ [ctrl] บนแป้นพิมพ์ของคุณ)
- ลากคอลัมน์ไปยังตำแหน่งอื่นภายในตาราง
จากนั้นคลิกบันทึก วิธีนี้จะลดลงและสร้างตารางใหม่ดังนั้นข้อผิดพลาดบางอย่างอาจเกิดขึ้น
ถ้าเปิดใช้งานตัวเลือกChange Trackingสำหรับฐานข้อมูลและตารางคุณไม่ควรใช้วิธีนี้
หากปิดใช้งานตัวเลือกป้องกันการบันทึกการเปลี่ยนแปลงที่ต้องใช้ตัวเลือกการสร้างตารางใหม่ควรถูกล้างในเมนูเครื่องมือ> ตัวเลือก> นักออกแบบมิฉะนั้นจะเกิดข้อผิดพลาด"ไม่อนุญาตให้บันทึกการเปลี่ยนแปลง"
ปัญหาอาจเกิดขึ้นระหว่างการสร้างคีย์หลักและคีย์ต่างประเทศ
หากข้อผิดพลาดใด ๆ ข้างต้นเกิดขึ้นการบันทึกจะล้มเหลวซึ่งจะทำให้คุณมีลำดับคอลัมน์เดิม
This task cannot be performed using Transact-SQL statements.
" ในเอกสารไม่ถูกต้อง ฉันอธิบายผู้เขียนและขอให้เขาเปลี่ยนเป็น " This task is not supported using Transact-SQL statements.
" ประมาณหนึ่งวันที่ผ่านมาผู้เขียนเห็นด้วยและเอกสารได้รับการแก้ไข คุณสามารถทำตามการสนทนาที่เรามีอยู่บน GitHub
คำถามนี้คล้ายกับคำถามเกี่ยวกับการจัดลำดับระเบียนในผลลัพธ์ของแบบสอบถาม .. และโดยทั่วไปแล้วไม่มีใครชอบคำตอบที่ถูกต้องอย่างเป็นทางการ ;-)
นี่คือ:
select *
จึงไม่บังคับให้ส่งคืนคอลัมน์ตามลำดับเฉพาะcreate table' or in the
ตารางแก้ไขเพิ่มคำสั่ง "แน่นอนคุณสามารถเปลี่ยนลำดับของคอลัมน์ในคำสั่ง sql อย่างไรก็ตามหากคุณต้องการเรียงลำดับคอลัมน์ทางกายภาพของตารางนามธรรมคุณสามารถสร้างมุมมองได้ กล่าวคือ
CREATE TABLE myTable(
a int NULL,
b varchar(50) NULL,
c datetime NULL
);
CREATE VIEW vw_myTable
AS
SELECT c, a, b
FROM myTable;
select * from myTable;
a b c
- - -
select * from vw_myTable
c a b
- - -
ใน SQLServer Management Studio:
เครื่องมือ -> ตัวเลือก -> นักออกแบบ -> นักออกแบบตารางและฐานข้อมูล
จากนั้น:
SQLServer Management studio จะวางตารางและสร้างขึ้นใหม่โดยใช้ข้อมูล
คุณสามารถทำได้โดยสร้างตารางใหม่คัดลอกข้อมูลทั้งหมดวางตารางเก่าจากนั้นเปลี่ยนชื่อตารางใหม่เพื่อแทนที่ตารางเก่า
คุณยังสามารถเพิ่มคอลัมน์ใหม่ลงในตารางคัดลอกคอลัมน์ตามข้อมูลคอลัมน์วางคอลัมน์เก่าจากนั้นเปลี่ยนชื่อคอลัมน์ใหม่ให้ตรงกับคอลัมน์เก่า ตัวอย่างง่ายๆด้านล่าง: http://sqlfiddle.com/#!3/67af4/1
CREATE TABLE TestTable (
Column1 INT,
Column2 VARCHAR(255)
);
GO
insert into TestTable values(1, 'Test1');
insert into TestTable values(2, 'Test2');
GO
select * from TestTable;
GO
ALTER TABLE TestTable ADD Column2_NEW VARCHAR(255);
ALTER TABLE TestTable ADD Column1_NEW INT;
GO
update TestTable
set Column1_NEW = Column1,
Column2_NEW = Column2;
GO
ALTER TABLE TestTable DROP COLUMN Column1;
ALTER TABLE TestTable DROP COLUMN Column2;
GO
sp_rename 'TestTable.Column1_NEW', 'Column1', 'COLUMN';
GO
sp_rename 'TestTable.Column2_NEW', 'Column2', 'COLUMN';
GO
select * from TestTable;
GO
ใน SQLServer Management Studio:
Tools
-> Options
-> Designers
->Table and Database Designers
Prevent saving changes that require table re-creation
ยกเลิกการเลือก
ตอนนี้คุณสามารถจัดลำดับตารางใหม่ได้
เซิร์ฟเวอร์ SQL สร้างสคริปต์ภายใน สร้างตารางชั่วคราวพร้อมการเปลี่ยนแปลงใหม่และคัดลอกข้อมูลและวางตารางปัจจุบันจากนั้นสร้างตารางแทรกใหม่จากตารางชั่วคราว หาได้จากตัวเลือก "Generate Change script" ssms 2014 สคริปต์แบบนี้ จากที่นี่: วิธีเปลี่ยนลำดับคอลัมน์ในตารางโดยใช้แบบสอบถาม sql
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_emps
(
id int NULL,
ename varchar(20) NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_emps SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.emps)
EXEC('INSERT INTO dbo.Tmp_emps (id, ename)
SELECT id, ename FROM dbo.emps WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.emps
GO
EXECUTE sp_rename N'dbo.Tmp_emps', N'emps', 'OBJECT'
GO
COMMIT
หากตารางของคุณมีคอลัมน์เพียงพอคุณสามารถลองสิ่งนี้ได้ ขั้นแรกให้สร้างตารางใหม่โดยมีลำดับคอลัมน์ที่ต้องการ
create table new as select column1,column2,column3,....columnN from table_name;
ตอนนี้วางตารางโดยใช้คำสั่ง drop
drop table table_name;
ตอนนี้เปลี่ยนชื่อตารางที่สร้างขึ้นใหม่เป็นชื่อตารางเก่าของคุณ
rename new to table_name;
ตอนนี้เลือกตารางคุณได้จัดเรียงคอลัมน์ใหม่ตามที่คุณต้องการก่อนหน้านี้
select * from table_name;
ในตอนท้ายของวันคุณไม่สามารถทำได้ใน MS SQL ฉันเพิ่งสร้างตารางขณะเดินทาง (การเริ่มต้นแอปพลิเคชัน) โดยใช้ขั้นตอนที่เก็บไว้ซึ่งอ่านจากตารางการค้นหา เมื่อฉันสร้างมุมมองที่รวมสิ่งเหล่านี้กับตารางอื่นที่ฉันได้สร้างขึ้นด้วยตนเองก่อนหน้านี้ (สคีมาเดียวกันกับข้อมูล) มันล้มเหลวเพราะฉันใช้ '' เลือก * UNION เลือก * 'สำหรับมุมมอง ในขณะเดียวกันถ้าฉันใช้เฉพาะสิ่งที่สร้างขึ้นผ่านขั้นตอนการจัดเก็บฉันก็ทำได้สำเร็จ
โดยสรุป: หากมีแอปพลิเคชันใด ๆ ที่ขึ้นอยู่กับลำดับของคอลัมน์แสดงว่าเป็นการเขียนโปรแกรมที่ไม่ดีและจะสร้างปัญหาในอนาคตอย่างแน่นอน คอลัมน์ควร 'รู้สึก' เป็นอิสระที่จะอยู่ที่ใดก็ได้และใช้สำหรับกระบวนการข้อมูลใด ๆ (INSERT, UPDATE, SELECT)
คุณสามารถบรรลุได้ด้วยขั้นตอนเหล่านี้:
ลบคีย์แปลกปลอมและคีย์หลักของตารางเดิมทั้งหมด
เปลี่ยนชื่อตารางเดิม
ใช้ CTAS สร้างตารางเดิมตามลำดับที่คุณต้องการ
วางโต๊ะเก่า
ใช้ข้อ จำกัด ทั้งหมดกลับไปที่ตารางเดิม
หากคอลัมน์ที่จะจัดเรียงใหม่เพิ่งถูกสร้างขึ้นและว่างเปล่าคุณสามารถลบคอลัมน์และเพิ่มใหม่ได้ตามลำดับที่ถูกต้อง
สิ่งนี้เกิดขึ้นกับฉันการขยายฐานข้อมูลด้วยตนเองเพื่อเพิ่มฟังก์ชันใหม่และฉันพลาดคอลัมน์ออกไปและเมื่อฉันเพิ่มเข้าไปลำดับก็ไม่ถูกต้อง
หลังจากไม่พบวิธีแก้ปัญหาที่เพียงพอฉันก็แก้ไขตารางโดยใช้คำสั่งประเภทต่อไปนี้
ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname columntype;
หมายเหตุ: ทำได้เฉพาะในกรณีที่คุณไม่มีข้อมูลในคอลัมน์ที่คุณกำลังทิ้ง
มีคนบอกว่าลำดับคอลัมน์ไม่สำคัญ ฉันใช้ SQL Server Management Studio "สร้างสคริปต์" เป็นประจำเพื่อสร้างเวอร์ชันข้อความของสคีมาของฐานข้อมูล ในการควบคุมเวอร์ชันอย่างมีประสิทธิภาพสคริปต์เหล่านี้ (git) และเปรียบเทียบ (WinMerge) จำเป็นที่ผลลัพธ์จากฐานข้อมูลที่เข้ากันได้จะเหมือนกันและความแตกต่างที่เน้นคือความแตกต่างของฐานข้อมูลของแท้
ลำดับคอลัมน์มีความสำคัญ แต่สำหรับบางคนไม่ใช่ทุกคน!
ฉันคิดว่าคุณต้องการเพิ่มคอลัมน์ใหม่ในตำแหน่งเฉพาะ คุณสามารถสร้างคอลัมน์ใหม่ได้โดยย้ายคอลัมน์ปัจจุบันไปทางขวา
+---+---+---+
| A | B | C |
+---+---+---+
ลบดัชนีที่ได้รับผลกระทบและการอ้างอิงคีย์ต่างประเทศทั้งหมด เพิ่มคอลัมน์ใหม่ที่มีประเภทข้อมูลเดียวกันเช่นคอลัมน์สุดท้ายและคัดลอกข้อมูลที่นั่น
+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
|___^
เปลี่ยนประเภทข้อมูลของคอลัมน์ที่สามเป็นประเภทเดียวกันเช่นคอลัมน์ก่อนหน้าและคัดลอกข้อมูลที่นั่น
+---+---+---+---+
| A | B | B | C |
+---+---+---+---+
|___^
เปลี่ยนชื่อคอลัมน์ตามลำดับสร้างดัชนีที่ถูกลบและการอ้างอิงคีย์ต่างประเทศใหม่
+---+---+---+---+
| A | D | B | C |
+---+---+---+---+
เปลี่ยนชนิดข้อมูลของคอลัมน์ที่สอง
เก็บไว้ในใจว่าคำสั่งคอลัมน์ที่เป็นแค่ "เครื่องสำอาง" สิ่งที่เหมือนmarc_s กล่าวว่า
ใช้
SELECT * FROM TABLE1
ซึ่งแสดงลำดับคอลัมน์เริ่มต้นของตาราง
หากคุณต้องการเปลี่ยนลำดับของคอลัมน์
ระบุชื่อคอลัมน์ที่จะแสดงตามลำดับ
SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1
คุณสามารถใช้การจัดทำดัชนี .. หลังจากการจัดทำดัชนีหากเลือก * จาก XXXX ผลลัพธ์ควรเป็นไปตามดัชนี แต่ชุดผลลัพธ์เท่านั้น .. ไม่ใช่โครงสร้างของตาราง
คุณสามารถเปลี่ยนแปลงได้โดยใช้แบบสอบถาม SQL นี่คือแบบสอบถาม sql เพื่อเปลี่ยนลำดับของคอลัมน์
ALTER TABLE table name
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
เพื่อให้มีลำดับคอลัมน์เฉพาะคุณต้องเลือกคอลัมน์ทีละคอลัมน์ตามลำดับที่คุณต้องการ ลำดับการเลือกกำหนดว่าจะเรียงลำดับคอลัมน์อย่างไรในเอาต์พุต
ลองใช้คำสั่งนี้:
alter table students modify age int(5) first;
สิ่งนี้จะเปลี่ยนตำแหน่งของอายุเป็นตำแหน่งแรก
แก้ไขชื่อตารางแก้ไขชื่อคอลัมน์ int (5) ก่อน; จะนำคอลัมน์ไปแก้ไขชื่อตารางครั้งแรกแก้ไขชื่อคอลัมน์ int (5) หลัง (tablename);
ตัวอย่าง: เปลี่ยนตำแหน่งของ field_priority หลังจาก field_price ในสถานะตาราง
ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;