এসকিউএল সার্ভার 2005 এ এসকিউএল কোয়েরি ব্যবহার করে কোনও টেবিলের কলাম ক্রম কীভাবে পরিবর্তন করবেন?
আমি এসকিউএল কোয়েরি ব্যবহার করে একটি সারণীতে কলাম ক্রম পুনরায় সাজতে চাই।
এসকিউএল সার্ভার 2005 এ এসকিউএল কোয়েরি ব্যবহার করে কোনও টেবিলের কলাম ক্রম কীভাবে পরিবর্তন করবেন?
আমি এসকিউএল কোয়েরি ব্যবহার করে একটি সারণীতে কলাম ক্রম পুনরায় সাজতে চাই।
উত্তর:
তুমি পার না. এসএমএল সার্ভারের কাছে কলামের ক্রমটি কেবল একটি "প্রসাধনী" বিষয় যা আমরা মনুষ্যদের মনে করি it's এটি প্রায় সর্বদা অপ্রাসঙ্গিক।
আপনি যখন কলামের ক্রম পরিবর্তন করবেন তখন এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওটি ব্যাকগ্রাউন্ডে কী করে তা কোনও নতুন CREATE TABLE
কমান্ডের সাহায্যে টেবিলটি আবার নতুন কমান্ড দিয়ে পুনরায় তৈরি করা হয় , পুরানো টেবিল থেকে ডেটা অনুলিপি করে এবং তারপরে ফেলে দেওয়া হয়।
কলাম ক্রম সংজ্ঞায়িত করার জন্য কোনও এসকিউএল আদেশ নেই।
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 অনুসারে
লেনদেন-এসকিউএল স্টেটমেন্ট ব্যবহার করে এই কাজটি সমর্থিত নয়।
ঠিক আছে, এটি করা যাবে, create
/ অনুলিপি / drop
/ পুনর্নবীকরণ ব্যবহার করে , হিসাবে komma8.komma1 দ্বারা উত্তর
অথবা আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করতে পারেন
- ইন অবজেক্ট এক্সপ্লোরার , কলাম টেবিল ডান-ক্লিক করুন পুনর্বিন্যাস করতে যদি আপনি চান এবং ক্লিক করুন ডিজাইন (Ver মধ্যে পরিবর্তন করুন। 2005 এসপি 1 বা তার আগে)
- আপনি যে কলামটির নামটি পুনঃক্রম করতে চান তার বাম দিকে বাক্সটি নির্বাচন করুন। (আপনি আপনার কীবোর্ডে [শিফট] বা [সিআরটিএল] কী ধরে রেখে একাধিক কলাম নির্বাচন করতে পারেন))
- কলামটি গুলি টেবিলের মধ্যে অন্য স্থানে টানুন।
তারপরে সেভ ক্লিক করুন। এই পদ্ধতিটি আসলে টেবিলটি ড্রপ করে পুনরায় তৈরি করে, যাতে কিছু ত্রুটি ঘটতে পারে।
যদি ট্র্যাকিং পরিবর্তন করুন বিকল্পটি ডাটাবেস এবং টেবিলের জন্য সক্ষম করা থাকে তবে আপনার এই পদ্ধতিটি ব্যবহার করা উচিত নয়।
যদি এটি অক্ষম করা থাকে, সংরক্ষণের পরিবর্তনগুলি প্রতিরোধ করুন যা টেবিল পুনর্নির্মাণ বিকল্পের জন্য প্রয়োজনীয় সেটিংস মেনু> বিকল্প> ডিজাইনারগুলিতে সাফ করা উচিত, অন্যথায় "পরিবর্তনগুলি সংরক্ষণের অনুমতি নেই" ত্রুটি ঘটবে।
প্রাথমিক এবং বিদেশী কী তৈরির সময় সমস্যাও দেখা দিতে পারে।
যদি উপরের ত্রুটিগুলির কোনওটি ঘটে থাকে তবে সংরক্ষণ ব্যর্থ হয় যা আপনাকে মূল কলাম ক্রমের সাথে ছেড়ে দেয়।
This task cannot be performed using Transact-SQL statements.
দস্তাবেজের " " বক্তব্যটি ভুল ছিল। আমি লেখককে ব্যাখ্যা করে তাকে " This task is not supported using Transact-SQL statements.
" এ পরিবর্তিত করতে বলেছিলাম । প্রায় এক দিন আগে, লেখক সম্মত হন এবং নথিটি স্থির করে দেওয়া হয়েছিল। গিটহাবে আমাদের যে আলোচনা হয়েছিল তা আপনি অনুসরণ করতে পারেন ।
এটি কোনও প্রশ্নের ফলাফলের রেকর্ডগুলি অর্ডার করার প্রশ্নের সাথে সমান .. এবং সাধারণত কেউই আনুষ্ঠানিকভাবে সঠিক উত্তর পছন্দ করে না ;-)
সুতরাং এখানে এটি যায়:
select *
একটি নির্দিষ্ট ক্রমে কলামগুলি ফেরত দিতে বাধ্য করে নাcreate table' or in the
পরিবর্তিত সারণিতে যোগ করুন `বিবৃতিগুলিআপনি অবশ্যই একটি বর্গ বিবৃতিতে কলামগুলির ক্রম পরিবর্তন করতে পারেন। তবে আপনি যদি টেবিলগুলির শারীরিক কলাম ক্রম বিমূর্ত করতে চান তবে আপনি একটি দৃশ্য তৈরি করতে পারেন। অর্থাত
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
- - -
এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে:
সরঞ্জাম -> বিকল্প -> ডিজাইনার -> সারণী এবং ডেটাবেস ডিজাইনার
তারপর:
এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওটি টেবিলটি ফেলে দেবে এবং ডেটা ব্যবহার করে এটি পুনরায় তৈরি করবে।
আপনি এটি একটি নতুন টেবিল তৈরি করে, সমস্ত ডেটা অনুলিপি করে, পুরানো টেবিলটি ফেলে দিতে পারেন, তারপরে পুরানোটিকে প্রতিস্থাপন করতে নতুনটির নাম পরিবর্তন করে।
আপনি টেবিলটিতে নতুন কলামও যুক্ত করতে পারেন, কলামের তথ্য দিয়ে কলামটি অনুলিপি করতে পারেন, পুরানো কলামগুলি ফেলে দিতে পারেন, এবং পুরানোগুলির সাথে মেলে নতুন কলামগুলির নাম পরিবর্তন করতে পারেন। নীচে একটি সাধারণ উদাহরণ: 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
এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে:
Tools
-> Options
->Designers
->Table and Database Designers
নির্বাচন মুক্ত করুন Prevent saving changes that require table re-creation
।
এখন আপনি টেবিলটি পুনরায় অর্ডার করতে পারেন।
স্কেল সার্ভার অভ্যন্তরীণভাবে স্ক্রিপ্টটি তৈরি করে। এটি নতুন পরিবর্তনগুলির সাথে একটি অস্থায়ী টেবিল তৈরি করে এবং ডেটা অনুলিপি করে এবং বর্তমান টেবিলটি ফেলে দেয় তবে টেম্প টেবিল থেকে সারণী সন্নিবেশটি পুনরায় তৈরি করে। আমি এটি "জেনারেট চেঞ্জ স্ক্রিপ্ট" বিকল্প এসএমএস 2014 থেকে পেয়েছি Script স্ক্রিপ্ট এর মতো। এখান থেকে : এসকিএল কোয়েরি ব্যবহার করে কোনও সারণীতে কলাম ক্রম কীভাবে পরিবর্তন করবেন
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 table table_name;
এখন নতুন তৈরি করা টেবিলটির নাম পরিবর্তন করে আপনার পুরানো টেবিলের নাম দিন।
rename new to table_name;
এখন টেবিলটি নির্বাচন করুন, আপনার কলামগুলি আগের পছন্দ অনুযায়ী পুনরায় সাজানো হয়েছে।
select * from table_name;
দিন শেষে, আপনি কেবল এমএস এসকিউএল এ এটি করতে পারবেন না। আমি সম্প্রতি একটি সঞ্চিত প্রক্রিয়া যা কোনও অনুসন্ধান সারণী থেকে পড়ে তা ব্যবহার করে চলার সময়ে (অ্যাপ্লিকেশন স্টার্টআপ) সারণী তৈরি করেছি। আমি যখন এমন একটি ভিউ তৈরি করেছি যা এগুলি অন্য একটি টেবিলের সাথে ম্যানুয়ালি আমি আগে তৈরি করেছি (একই স্কিমা, ডেটা সহ) তৈরি হয়েছিল তখন এটি ব্যর্থ হয়েছিল - কেবলমাত্র আমি দৃশ্যের জন্য '' সিলেক্ট * ইউনিয়ন সিলেক্ট * 'ব্যবহার করছিলাম। একই সময়ে, আমি যদি কেবলমাত্র সঞ্চিত প্রক্রিয়াটির মাধ্যমে তৈরি করা ব্যবহার করি তবে আমি সফল।
উপসংহারে: যদি এমন কোনও অ্যাপ্লিকেশন থাকে যা কলামের ক্রমের উপর নির্ভর করে তবে এটি সত্যই ভাল প্রোগ্রামিং নয় এবং ভবিষ্যতে অবশ্যই সমস্যা তৈরি করবে। কলামগুলি যে কোনও জায়গায় নিখরচায় 'বোধ করা' উচিত এবং যেকোন ডেটা প্রক্রিয়া (ইনসার্ট, আপডেট, নির্বাচন) ব্যবহার করা উচিত।
আপনি এই পদক্ষেপগুলি দিয়ে এটি অর্জন করতে পারেন:
সমস্ত বিদেশী কী এবং মূল টেবিলের প্রাথমিক কী সরিয়ে ফেলুন।
মূল টেবিলটির নতুন নাম দিন।
সিটিএএস ব্যবহার করে আপনি চান ক্রমে মূল টেবিল তৈরি করুন।
পুরানো টেবিলটি ফেলে দিন।
সমস্ত সীমাবদ্ধতাগুলি মূল টেবিলটিতে ফিরে যান
যদি কলামগুলি পুনঃক্রম করতে হয় তবে সম্প্রতি তৈরি করা হয়েছে এবং খালি থাকলে কলামগুলি মুছে ফেলা যায় এবং সঠিক ক্রমে পুনরায় যুক্ত করা যেতে পারে।
আমার সাথে এটি ঘটেছিল, নতুন কার্যকারিতা যুক্ত করার জন্য ম্যানুয়ালি একটি ডাটাবেস বাড়িয়েছিলাম এবং আমি একটি কলামটি মিস করেছি এবং আমি এটি যুক্ত করার পরে ক্রমটি ভুল ছিল।
এখানে পর্যাপ্ত সমাধানের সন্ধান করার পরে আমি নিম্নলিখিত ধরণের কমান্ড ব্যবহার করে কেবল টেবিলটি সংশোধন করেছি।
ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname columntype;
দ্রষ্টব্য: আপনি যদি কলামগুলিতে ফেলে যাচ্ছেন এমন ডেটা না থাকলে কেবল এটি করুন only
লোকেরা বলেছে যে কলামের অর্ডার তাতে কিছু যায় আসে না। ডেটাবেসের স্কিমার একটি পাঠ্য সংস্করণ তৈরি করতে আমি নিয়মিত এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও "জেনারেট স্ক্রিপ্ট" ব্যবহার করি। এই স্ক্রিপ্টগুলি (গিট) এর কার্যকরভাবে সংস্করণ নিয়ন্ত্রণ করতে এবং সেগুলি (উইনমার্গ) তুলনা করার জন্য, এটি জরুরী যে সামঞ্জস্যপূর্ণ ডাটাবেসগুলি থেকে আউটপুট একই হয় এবং হাইলাইট করা পার্থক্য হ'ল আসল ডাটাবেস পার্থক্য।
কলামের আদেশে কিছু যায় আসে না; তবে কিছু লোকের কাছে, সবার কাছে নয়!
আমি মনে করি আপনি একটি নির্দিষ্ট অবস্থানে একটি নতুন কলাম যুক্ত করতে চান। আপনি ডানদিকে বর্তমান কলামগুলি সরিয়ে একটি নতুন কলাম তৈরি করতে পারেন।
+---+---+---+
| A | B | C |
+---+---+---+
সমস্ত প্রভাবিত সূচক এবং বিদেশী কী উল্লেখগুলি সরান। সর্বশেষ কলামের মতো ঠিক একই ডেটা টাইপের সাথে একটি নতুন কলাম যুক্ত করুন এবং সেখানে ডেটা অনুলিপি করুন।
+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
|___^
পূর্ববর্তী কলামের মতো তৃতীয় কলামের ডেটা ধরণের একই ধরণের পরিবর্তন করুন এবং সেখানে ডেটা অনুলিপি করুন।
+---+---+---+---+
| A | B | B | C |
+---+---+---+---+
|___^
সেই অনুযায়ী কলামগুলির নাম পরিবর্তন করুন, সরানো সূচি এবং বিদেশী কী উল্লেখগুলি পুনরায় তৈরি করুন।
+---+---+---+---+
| A | D | B | C |
+---+---+---+---+
দ্বিতীয় কলমের ডাটা টাইপ পরিবর্তন করুন।
মনে রাখবেন যে কলামের আদেশটি কেবল "কসমেটিক" জিনিস যা মার্ক_স বলেছেন ।
ব্যবহার
SELECT * FROM TABLE1
যা টেবিলের ডিফল্ট কলাম অর্ডার প্রদর্শন করে।
আপনি যদি কলামগুলির ক্রম পরিবর্তন করতে চান।
অনুরূপভাবে প্রদর্শন করতে কলামের নাম উল্লেখ করুন
SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1
আপনি এসকিউএল কোয়েরি ব্যবহার করে এটি পরিবর্তন করতে পারেন। কলামের ক্রম পরিবর্তন করতে এখানে বর্গ কোয়েরি রয়েছে।
ALTER TABLE table name
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
নির্দিষ্ট কলামের অর্ডার পেতে আপনার ইচ্ছামতো ক্রম অনুসারে কলামটি কলাম দ্বারা নির্বাচন করতে হবে। নির্বাচনের অর্ডার আউটপুটে কলামগুলি কীভাবে অর্ডার করা হবে তা নির্দেশ করে।
এই আদেশটি ব্যবহার করে দেখুন:
alter table students modify age int(5) first;
এটি বয়সের অবস্থানকে প্রথম অবস্থানে পরিবর্তন করবে।
টেবিলের নাম পরিবর্তন করুন কলামনাম ইন্ট (5) প্রথমে পরিবর্তন করুন; টেবিলের নামটি প্রথমে পরিবর্তনের টেবিলের নাম কলামটি আনবে (টেবিলের নাম) পরে কলাম নাম (5) পরিবর্তন করুন;
উদাহরণ: সারণী স্থিতিতে ক্ষেত্রের_পরের পরে ক্ষেত্রের_পরিচিতির অবস্থান পরিবর্তন করুন।
ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;