আমি কীভাবে একটি এসকিউএল ডাটাবেস টেবিলের কলামটির নাম পরিবর্তন করব?


296

আমার এসকিউএল ডাটাবেসে কয়েকটি টেবিলের কয়েকটি কলামের নাম পরিবর্তন করতে হবে। আমি জানি যে স্ট্যাকওভারফ্লোতে আগে অনুরূপ প্রশ্ন জিজ্ঞাসা করা হয়েছিল, তবে এটি সাধারণভাবে এসকিউএলের জন্য ছিল এবং এসকিউএলাইটের ক্ষেত্রে উল্লেখ করা হয়নি।

অ্যালটার টেবিলে এসকিউএলাইট ডকুমেন্টেশন থেকে , আমি সংগ্রহ করি যে "সহজেই" (অর্থাত্ একটি একক বিকল্প টেবিলে বিবৃতি) এ জাতীয় কোনও কাজ করা সম্ভব নয়।

আমি ভাবছিলাম যে কেউ এসকিউএলাইটের সাথে এই জাতীয় কাজ করার জেনেরিক এসকিউএল উপায় সম্পর্কে জানেন।


স্ক্লাইটের জন্য আপনি খুব সহজেই ডিবি ব্রাউজার ব্যবহার করে এটি করতে পারেন
ম্যাট জি

1
দয়া করে এই উত্তরটিকে স্বীকৃত স্ট্যাকওভারফ্লো.com
ইভান ক্যারল

উত্তর:


66

এটি সবেমাত্র 2018-09-15 (3.25.0) এর সাথে ঠিক করা হয়েছিল

ALTER TABLEআদেশটি বৃদ্ধি করে :

  • ব্যবহার করে একটি টেবিলের মধ্যে কলাম পুনঃনামকরনের জন্য সমর্থন যোগ ALTER TABLEটেবিল RENAME COLUMN oldname TO newname
  • সারণী নামকরণ বৈশিষ্ট্যটি ঠিক করুন যাতে এটি ট্রিগার এবং দর্শনে পুনরায় নামকরণ করা টেবিলের উল্লেখগুলিও আপডেট করে updates

এর অধীনে নথিভুক্ত নতুন সিনট্যাক্সটি খুঁজে পেতে পারেন ALTER TABLE

RENAME COLUMN TOসিনট্যাক্স নতুন-কলাম-নাম মধ্যে টেবিল সারণীর-নাম কলাম-নাম পরিবর্তন। কলামের নামটি টেবিল সংজ্ঞা নিজেই এবং সমস্ত সূচী, ট্রিগার এবং কলামের রেফারেন্সের মধ্যেও পরিবর্তিত হয়। যদি কলামের নাম পরিবর্তনের ফলে ট্রিগার বা দর্শনে অর্থপূর্ণ অস্পষ্টতা দেখা দেয়, তবে RENAME COLUMNত্রুটিযুক্ত ব্যর্থ হয় এবং কোনও পরিবর্তন প্রয়োগ করা হয় না।

এখানে চিত্র বর্ণনা লিখুন চিত্র উত্স: https://www.sqlite.org/images/syntax/alter-table-stmt.gif

উদাহরণ:

CREATE TABLE tab AS SELECT 1 AS c;

SELECT * FROM tab;

ALTER TABLE tab RENAME COLUMN c to c_new;

SELECT * FROM tab;

db-food.com ডেমো


অ্যান্ড্রয়েড সমর্থন

লেখার হিসাবে, অ্যান্ড্রয়েডের এপিআই 27 এসকিউএলাইট প্যাকেজ সংস্করণ 3.19 ব্যবহার করছে

অ্যান্ড্রয়েড যে বর্তমান সংস্করণটি ব্যবহার করছে এবং এসকিউএলাইটের ৩.২৫.০ সংস্করণে এই আপডেটটি আসছে তার উপর ভিত্তি করে আমি বলব যে এন্ড্রয়েডে সমর্থন যোগ করার আগে আপনার কিছুটা অপেক্ষা (প্রায় API 33) করা উচিত।

এবং তারপরেও, যদি আপনাকে API 33 এর চেয়ে পুরানো কোনও সংস্করণ সমর্থন করতে হয় তবে আপনি এটি ব্যবহার করতে সক্ষম হবেন না।


8
আমি অ্যান্ড্রয়েড মাইগ্রেশনের জন্য বাস্তবায়ন করছি এবং দুর্ভাগ্যক্রমে ইন্টেলিজ একটি সতর্কতা দেখিয়ে দিচ্ছে যে এটি কোনও বৈধ এসকিউএল কমান্ড নয়। database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")COLUM লালচে হাইলাইটাইটেড এবং এটি বলে প্রত্যাশিত, 'COLUMN' পেয়েছে । দুর্ভাগ্যক্রমে অ্যান্ড্রয়েড এখনও এসকিউএলাইট সংস্করণ 3.19 এ রয়েছে যার কারণে এটি আমার পক্ষে কার্যকর হয় না।
অ্যাডাম হুরউইজ

1
সম্পাদিত: আমি system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q1পেয়েছি , যে 1.0.109.x) আসলে এসকিউএলটি 3.24 এবং সিস্টেম.ডাটা.এসকিউএলাইট ব্যবহার করছে এসকিউএলাইট ৩.২৫ ব্যবহার করে এই মাসে রিলেটেড করার জন্য শিডুল করা হয়েছে।
rychlmoj

1
এফওয়াইআই, দুর্ভাগ্যক্রমে এটি এখনও অ্যান্ড্রয়েডের এসকিউএল লাইব্রেরি দ্বারা প্রয়োগ করা হয়নি । আশা করি তারা শীঘ্রই আপডেট হবে।
অ্যাডাম হুরউইটজ

3
অন্যদের আশা না থেকে বাঁচাতে আমি Android সাপোর্টের জন্য একটি বিভাগ যুক্ত করেছি। অ্যান্ড্রয়েড ২ 27 এর এসকিউএলাইট ৩.১৯ এর বর্তমান ব্যবহারের ভিত্তিতে, এই বৈশিষ্ট্যটি অ্যান্ড্রয়েডে যুক্ত হওয়ার আগে আমাদের মোটামুটি এপিআই 33 পর্যন্ত অপেক্ষা করতে হবে এবং তারপরেও এটি কেবলমাত্র সর্বশেষতম সংস্করণগুলিতে সমর্থিত হবে। দীর্ঘশ্বাস.
জোশুয়া পিন্টার

1
@ জোশুয়াপিন্টার আমার উত্তর বাড়ানোর জন্য ধন্যবাদ Thanks
লুকাশজ সজোদা 17

448

বলুন আপনার একটি টেবিল রয়েছে এবং "কলব" নামটি "কল_বি" করতে হবে:

প্রথমে আপনি পুরানো টেবিলটির নাম পরিবর্তন করুন:

ALTER TABLE orig_table_name RENAME TO tmp_table_name;

তারপরে পুরানো টেবিলের উপর ভিত্তি করে তবে আপডেট হওয়া কলামের নাম সহ নতুন টেবিলটি তৈরি করুন:

CREATE TABLE orig_table_name (
  col_a INT
, col_b INT
);

তারপরে মূল টেবিল থেকে সামগ্রীগুলি অনুলিপি করুন।

INSERT INTO orig_table_name(col_a, col_b)
SELECT col_a, colb
FROM tmp_table_name;

শেষ অবধি, পুরানো টেবিলটি ফেলে দিন।

DROP TABLE tmp_table_name;

একটি এই সব মোড়ানো BEGIN TRANSACTION;এবং COMMIT;এছাড়াও সম্ভবত একটি ভাল ধারণা।


51
এবং আপনার সূচকগুলি ভুলে যাবেন না।
টম মেফিল্ড

11
খুব গুরুত্বপূর্ণভাবে উপরের উদাহরণ কোডটিতে একটি লেনদেন অনুপস্থিত। আপনার পুনরায় নামকরণ সফলভাবে শেষ হয়েছে কিনা তা নিশ্চিত করার জন্য আপনার পুরো জিনিসটি একটি BEGIN / End (বা রোলব্যাক) এ মোড়ানো উচিত।
রজার বিনস

4
অ্যান্ড্রয়েডে এটি করতে ইচ্ছুক যে কেউ এসকিউএলডিটিবেস.বেগিন ট্রান্সঅ্যাকশন ()
বমআপিন

7
উত্তরে কোডটিতে এমন কিছু নেই যা সূচকগুলি অনুলিপি করে। একটি খালি টেবিল তৈরি করা এবং এতে ডেটা রাখা কেবল কাঠামো এবং ডেটা অনুলিপি করে। আপনি যদি মেটাডেটা (সূচকগুলি, বিদেশী কীগুলি, সীমাবদ্ধতাগুলি ইত্যাদি) চান, তবে আপনাকে প্রতিস্থাপিত টেবিলে এটি তৈরি করতে বিবৃতিও জারি করতে হবে।
টম মেফিল্ড

17
এসকিউএলাইটের .schemaকমান্ডটি CREATE TABLEবিদ্যমান টেবিলটি তৈরি করে এমন বিবৃতি প্রদর্শন করার জন্য কার্যকর । আপনি এর আউটপুট নিতে পারেন, প্রয়োজন অনুযায়ী সংশোধন করতে পারেন এবং নতুন টেবিলটি তৈরি করতে এটি কার্যকর করতে পারেন। এই কমান্ডটি CREATE INDEXসূচকগুলি তৈরি করতে প্রয়োজনীয় আদেশগুলিও দেখায় , যা থমাসের উদ্বেগকে আবৃত করে। অবশ্যই, কোনও কিছু পরিবর্তন করার আগে এই কমান্ডটি চালানোর বিষয়ে নিশ্চিত হন।
মাইক ডিসিমোন

56

আশেপাশে খনন করে, আমি পেয়েছি এই মাল্টিপ্লাটফর্ম (লিনাক্স | ম্যাক | উইন্ডোজ) গ্রাফিকাল সরঞ্জামটি এসকিউলাইটের জন্য ডিবি ব্রাউজার নামে পরিচিত যা আসলে একজনকে খুব ব্যবহারকারী বান্ধব উপায়ে কলামগুলির নাম পরিবর্তন করতে দেয়!

সম্পাদনা | সারণী পরিবর্তন করুন | টেবিল নির্বাচন করুন ক্ষেত্র সম্পাদনা করুন। ক্লিক ক্লিক করুন! ভাল খবর!

তবে, কেউ যদি এইভাবে প্রোগ্রাম করার পদ্ধতি ভাগ করে নিতে চান তবে আমি জেনে খুশি হব!


1
এখানে একটা হল ফায়ারফক্স অ্যাড-অন যে একই জিনিস আছে , ডান স্তম্ভ আপনি নামান্তর করুন এবং "কলাম সম্পাদনা করুন" করতে চান ক্লিক করুন।
জ্যাকব হ্যাকার

1
এমনকি

এটি এতটা ভোট পেয়ে আজব। আমরা এখানে প্রোগ্রামিং সম্পর্কে কথা বলছি (কোড)। আপনি কেন এই উত্তরটি এখানে পোস্ট করেছেন?
ব্যবহারকারী 25

2
আমার প্রশ্নের কোড সহ এটি কীভাবে করা যায় তার কোনও উল্লেখ নেই। আমি কেবলমাত্র জানতে চেয়েছিলাম কীভাবে একটি এসকিউএল ডিবিতে একটি কলামটির নাম পরিবর্তন করতে হবে।
joce

@ জোসে আমি তোমাকে ভালবাসি !!! (ভাইয়ের মতো) আমাকে ফিল্ড বদলে ফেলল, ভয়েলা। আমি এসকিউএলাইটে একটি এমএস অ্যাক্সেস টেবিল রফতানি করেছি এবং ক্ষেত্রের একটির সামনে একটি সংখ্যা ছিল: 3 ইয়ারলিটারসেন্ট। ভিজ্যুয়াল স্টুডিও টেবিল থেকে ক্লাস তৈরি করেছে তবে ক্ষেত্রের নামের সামনের দিকে "3" অঙ্কে চেপে গেছে। আমি এটা জানি, শুধু দেখছিলাম না।
জাস্টজহান

53

যদিও এটি সত্য যে কোনও বিকল্প কলম্ব নেই, আপনি যদি কেবলমাত্র কলামটির নাম পরিবর্তন করতে চান, নাল নট বাধা বা উপাত্তের ধরন পরিবর্তন করতে চান তবে আপনি নিম্নলিখিত কমান্ডের সেটটি ব্যবহার করতে পারেন:

দ্রষ্টব্য: এই আদেশগুলি আপনার ডেটাবেসকে দূষিত করার সম্ভাবনা রয়েছে তাই আপনার ব্যাকআপ রয়েছে কিনা তা নিশ্চিত হয়ে নিন

PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;

স্কিমায় পরিবর্তনগুলি পুনরায় লোড করার জন্য আপনাকে হয় আপনার সংযোগটি বন্ধ এবং পুনরায় খোলা বা ডেটাবেস ভ্যাকুয়াম করতে হবে।

উদাহরণ স্বরূপ:

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT NULL);  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
Error: BOOKS.publication_date may not be NULL  
sqlite> PRAGMA writable_schema = 1; 
sqlite> UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';  
sqlite> PRAGMA writable_schema = 0;  
sqlite> .q  

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
sqlite> .q  

অনুসরণ করুন:


pragma Writable_schema
যখন এই প্রগমা চালু থাকে, তখন SQLITE_MASTER টেবিলগুলিতে সাধারণ আপডেট, INSERT এবং বিবৃতি মুছে ফেলা ব্যবহার করে ডাটাবেস পরিবর্তন করা যায়। সতর্কতা: এই প্রগমাটির অপব্যবহারের ফলে সহজেই একটি দূষিত ডেটাবেস ফাইল তৈরি হতে পারে।

অল্টার টেবিল
SQLite ALTER TABLE এর একটি সীমিত উপসেট সমর্থন করে। এসকিউএলাইটে ALTER TABLE কমান্ড ব্যবহারকারীকে একটি সারণির নাম পরিবর্তন করতে বা বিদ্যমান সারণীতে একটি নতুন কলাম যুক্ত করতে দেয়। কোনও কলামের নাম পরিবর্তন করা, কোনও কলাম সরিয়ে ফেলা বা সারণী থেকে সীমাবদ্ধতা যুক্ত করা বা সরিয়ে ফেলা সম্ভব নয়।

টেবিল সিনট্যাক্স পরিবর্তন করুন


3
বিপজ্জনক, তবে এখনও সম্ভবত সবচেয়ে সোজা-এগিয়ে উত্তর ইমো।
টেক

2
হ্যাঁ অত্যন্ত দ্রুত - বিপজ্জনক কেবলমাত্র "আপনার প্রথমে ব্যাকআপ রয়েছে তা নিশ্চিত করুন"
নূহ

6
স্ক্লাইট ফাইল ফর্ম্যাটটি খুব সহজ এবং এজন্যই এই অপারেশনটি বৈধ। ফাইল ফর্ম্যাটে একটি টেবিল সম্পর্কে মাত্র দুটি সেট তথ্য রয়েছে: প্রকৃত পাঠ্য হিসাবে প্রকৃত তৈরি টেবিল কমান্ড এবং সারিগুলি, যার মানগুলি ক্রাইট কমান্ড থেকে ক্ষেত্রের ক্রম হিসাবে প্রদর্শিত হচ্ছে। যার অর্থ যে স্ক্লাইট কোডটি ডেটাবেস খোলে, এটি প্রতিটি ক্রেডিট কমান্ডকে পার্স করে এবং মেমরিতে গতিশীলভাবে তার কলামের তথ্য তৈরি করে। সুতরাং, যে কোনও কমান্ড ক্রিয়েট কমান্ডকে এমনভাবে পরিবর্তন করে যাতে একই সংখ্যক কলামগুলির সমাপ্তি কাজ করবে, আপনি তাদের ধরণ বা সীমাবদ্ধতাগুলি পরিবর্তন করেও।
টমাস টেম্পেলম্যান

3
@ থমাস টেম্পেলম্যান যদিও তবে ডেটাসেট দ্বারা পূরণ না হওয়া সীমাবদ্ধতা যুক্ত করা সমস্যার কারণ হতে পারে কারণ ক্যোয়ারী পরিকল্পনাকারী ধরে নিয়েছে যে সীমাবদ্ধতা রয়েছে।
ফুজ

2
@ThomasTempelmann সরানো হচ্ছে সীমাবদ্ধতা সবসময় জরিমানা। যোগ করার পদ্ধতি সীমাবদ্ধতার জরিমানা যদি বাধ্যতা সব সারি সন্তুষ্ট হয় কিন্তু আপনি অবশ্যই চেক করতে প্রয়োজন হয়।
ফুজ

18

সম্প্রতি আমাকে এসকিউএলাইট 3-এ করণীয় আইডির সাথে পয়েন্ট নামের একটি টেবিল সহ লোন, ল্যাট ছিল । ত্রুটিযুক্তভাবে, যখন টেবিলটি আমদানি করা হয়েছিল, অক্ষাংশের মানগুলি যেখানে দীর্ঘ কলাম এবং বিপরীতে সঞ্চিত রয়েছে, সুতরাং সেই কলামগুলির নাম পরিবর্তন করার জন্য একটি স্পষ্ট ফিক্স হবে। সুতরাং কৌশলটি ছিল:

create table points_tmp as select id, lon as lat, lat as lon from points;
drop table points;
alter table points_tmp rename to points;

আমি আশা করি এটি আপনার পক্ষে কার্যকর হবে!


এই পদ্ধতিটি পিকে মান যথাযথভাবে অনুলিপি করে না এবং স্বয়ংক্রিয়ভাবে লুকানো রোয়ারিড কলাম তৈরি করে। অগত্যা কোনও সমস্যা নয় তবে এটি উল্লেখ করতে চেয়েছিলাম কারণ এটি আমার জন্য একটি সমস্যা হয়ে দাঁড়িয়েছে।
টিপোশেল

4
"UPDATE পয়েন্টগুলি SET দীর্ঘ = ল্যাট, ল্যাট = দীর্ঘ;" করা কি সহজ হবে না?
কেএসটিপ

1
এই উত্তরটি সঠিক অর্ডার প্রক্রিয়াটি করে। প্রথমে টেম্প টেবিলটি তৈরি করুন এবং এটি পপুলেট করুন তারপরে আসলটি নষ্ট করুন
শিওনক্রস

14

স্ক্লাইট ডকুমেন্টেশন উদ্ধৃত :

SQLite ALTER TABLE এর একটি সীমিত উপসেট সমর্থন করে। এসকিউএলাইটে ALTER TABLE কমান্ড ব্যবহারকারীকে একটি সারণির নাম পরিবর্তন করতে বা বিদ্যমান সারণীতে একটি নতুন কলাম যুক্ত করতে দেয়। কোনও টেবিল থেকে কলমের নামকরণ, একটি কলাম সরিয়ে নেওয়া বা সীমাবদ্ধতাগুলি যুক্ত করা বা অপসারণ করা সম্ভব নয়।

আপনি অবশ্যই যা করতে পারেন তা হ'ল, নতুন লেআউট সহ একটি নতুন টেবিল তৈরি করুন SELECT * FROM old_tableএবং আপনি যে মানগুলি পেয়েছেন তা দিয়ে নতুন টেবিলটি পূরণ করুন।


7

প্রথমে, এই সেই জিনিসগুলির মধ্যে একটি যা আমাকে অবাক করে দিয়ে যায়: কলামটির নতুন নামকরণের জন্য সম্পূর্ণ নতুন টেবিল তৈরি করা এবং পুরানো টেবিল থেকে নতুন টেবিলে ডেটা অনুলিপি করা প্রয়োজন ...

গুই আমি করেছেন তার উপরে অবতরণ করেছে SQLite অপারেশন করতে হয় বেস । এটি একটি নিফটি লগ উইন্ডো পেয়েছে যা কার্যকর করা সমস্ত কমান্ড দেখায়। বেসের মাধ্যমে একটি কলামের নাম পরিবর্তন করে লগ উইন্ডোকে প্রয়োজনীয় কমান্ড দিয়ে পপুলেট করে:

বেস লগ উইন্ডো

এরপরে এগুলি সহজেই অনুলিপি করা এবং আটকানো যেতে পারে যেখানে আপনার প্রয়োজন হতে পারে। আমার জন্য, এটি একটি অ্যাক্টিভ অ্যান্ড্রয়েড into মাইগ্রেশন ফাইলের মধ্যে। পাশাপাশি একটি দুর্দান্ত স্পর্শ হ'ল অনুলিপি করা ডেটাতে কেবল এসকিউএলাইট কমান্ডগুলি অন্তর্ভুক্ত থাকে, টাইমস্ট্যাম্প ইত্যাদি নয় includes

আশা করি, এতে কিছু লোকের সময় সাশ্রয় হয়।


অবগতির জন্য, যদি আপনি হয় ব্যবহার ActiveAndroid , আপনি বাদ পারেন BEGIN TRANSACTION;এবং COMMIT;লাইন নিজে, ActiveAndroid হ্যান্ডলগুলি হিসাবে যে।
জোশুয়া পিন্টার 23

6

CASE 1: SQLite 3.25.0+

শুধুমাত্র এসকিউএলাইটের সংস্করণ 3.25.0 কলামগুলির নাম পরিবর্তন করতে সমর্থন করে। যদি আপনার ডিভাইসটি এই প্রয়োজনীয়তাটি পূরণ করে তবে জিনিসগুলি বেশ সহজ। নীচের ক্যোয়ারী আপনার সমস্যার সমাধান করবে:

ALTER TABLE "MyTable" RENAME COLUMN "OldColumn" TO "NewColumn";

CASE 2: এসকিউএলাইট পুরানো সংস্করণ

ফলাফলটি পেতে আপনাকে একটি ভিন্ন পদ্ধতির অনুসরণ করতে হবে যা কিছুটা জটিল

উদাহরণস্বরূপ, আপনার যদি এই জাতীয় একটি টেবিল থাকে:

CREATE TABLE student(Name TEXT, Department TEXT, Location TEXT)

এবং আপনি যদি কলামটির নাম পরিবর্তন করতে চান Location

পদক্ষেপ 1: মূল টেবিলটির নতুন নাম দিন:

ALTER TABLE student RENAME TO student_temp;

পদক্ষেপ 2: এখন studentসঠিক কলামের নাম সহ একটি নতুন টেবিল তৈরি করুন :

CREATE TABLE student(Name TEXT, Department TEXT, Address TEXT)

পদক্ষেপ 3: নতুন টেবিলটিতে মূল টেবিল থেকে ডেটা অনুলিপি করুন:

INSERT INTO student(Name, Department, Address) SELECT Name, Department, Location FROM student_temp;

দ্রষ্টব্য: উপরের কমান্ডটি সমস্ত লাইন হওয়া উচিত।

পদক্ষেপ 4: আসল টেবিলটি ফেলে দিন:

DROP TABLE student_temp;

এই চারটি পদক্ষেপের সাহায্যে আপনি যেকোন এসকিউএলাইট টেবিলটি ম্যানুয়ালি পরিবর্তন করতে পারেন। মনে রাখবেন যে নতুন টেবিলে আপনাকে যে কোনও সূচি, দর্শক বা ট্রিগারও পুনরায় তৈরি করতে হবে।


1
কিভাবে Android স্টুডিওতে 3.29.0 করার sqllite ডাটাবেসের সংস্করণে আপগ্রেড আমি API স্তর 28. ব্যবহার করছি
Nathani সফটওয়্যার

এসকিউএলাইট সংস্করণটি ডিভাইস দ্বারা সংজ্ঞায়িত করা হয় যা অ্যাপটি কাজ করে। এটি ডিভাইস নির্ভর।
ফেবিন ম্যাথিউ

1
পুরানো স্ক্লাইট ব্যবহার করা লোকেদের জন্য উপরের চারটি ধাপ নিরুত্সাহিত করা হয়েছে। Sqlite.org/lang_altertable.html এ "সাবধানতা" বিভাগটি দেখুন ।
জেফ

3

টেবিল কলাম <id> <_id> এ পরিবর্তন করুন

 String LastId = "id";

    database.execSQL("ALTER TABLE " + PhraseContract.TABLE_NAME + " RENAME TO " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("CREATE TABLE " + PhraseContract.TABLE_NAME
    +"("
            + PhraseContract.COLUMN_ID + " INTEGER PRIMARY KEY,"
            + PhraseContract.COLUMN_PHRASE + " text ,"
            + PhraseContract.COLUMN_ORDER  + " text ,"
            + PhraseContract.COLUMN_FROM_A_LANG + " text"
    +")"
    );
    database.execSQL("INSERT INTO " +
            PhraseContract.TABLE_NAME + "("+ PhraseContract.COLUMN_ID +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +")" +
            " SELECT " + LastId +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +
            " FROM " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("DROP TABLE " + PhraseContract.TABLE_NAME + "old");

3

কাঙ্ক্ষিত কলামের নাম সহ একটি নতুন কলাম তৈরি করুন: COLNew।

ALTER TABLE {tableName} ADD COLUMN COLNew {type};

পুরানো কলামের বিষয়গুলি অনুলিপি করুন COLOld নতুন কলামে COLNew।

INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}

দ্রষ্টব্য: উপরের লাইনে বন্ধনীগুলি প্রয়োজনীয়।


2

পূর্বে উল্লিখিত হিসাবে, একটি সরঞ্জাম এসকিউএলাইট ডাটাবেস ব্রাউজার রয়েছে, যা এটি করে। লিকলি, এই সরঞ্জামটি ব্যবহারকারী বা অ্যাপ্লিকেশন দ্বারা সম্পাদিত সমস্ত ক্রিয়াকলাপের লগ রাখে। এটি একবার করে এবং অ্যাপ্লিকেশন লগটি দেখে আপনি কোডটি জড়িত দেখতে পাবেন। কোয়েরিটি অনুলিপি করুন এবং প্রয়োজনীয় হিসাবে পেস্ট করুন। আমার জন্য কাজ করেছেন। আশাকরি এটা সাহায্য করবে


2

সরকারী ডকুমেন্টেশন থেকে

একটি সহজ এবং দ্রুত পদ্ধতি option চ্ছিকভাবে এমন কিছু পরিবর্তনের জন্য ব্যবহার করা যেতে পারে যা কোনওভাবেই ডিস্কের সামগ্রীকে প্রভাবিত করে না। নীচের সহজ পদ্ধতিটি চেক বা বিদেশী কী বা অপসারণ বা শুল্ক সীমাবদ্ধতা, কলামের নাম পরিবর্তনকরণ , বা কলামে ডিফল্ট মান যুক্ত বা অপসারণ বা পরিবর্তন করার জন্য উপযুক্ত।

  1. একটি লেনদেন শুরু করুন।

  2. বর্তমান স্কিমা সংস্করণ নম্বর নির্ধারণ করতে PRAGMA স্কিমা_বর্তন চালান। এই নম্বরটি নীচে 6 ধাপের জন্য প্রয়োজন হবে।

  3. PRAGMA Writable_schema = চালু ব্যবহার করে স্কিমা সম্পাদনা সক্রিয় করুন।

  4. স্ক্লাইট_মাস্টার সারণীতে টেবিল এক্সের সংজ্ঞা পরিবর্তনের জন্য একটি আপডেটের বিবৃতি চালান: আপডেট করুন স্ক্লাইট_মাস্টার সেট এসকিউএল = ... যেখানে টাইপ করুন = 'টেবিল' এবং নাম = 'এক্স';

    সাবধানতা: স্ক্লাইট_মাস্টার টেবিলটিতে এইভাবে পরিবর্তন করা ডাটাবেসটিকে দুর্নীতিগ্রস্ত এবং অপঠনযোগ্য রেন্ডার করে যদি পরিবর্তনটিতে একটি সিনট্যাক্স ত্রুটি থাকে। পরামর্শ দেওয়া হয় যে গুরুত্বপূর্ণ তথ্য সম্বলিত ডেটাবেজে এটি ব্যবহারের আগে একটি পৃথক ফাঁকা ডাটাবেসে UPDATE বিবৃতিটি সাবধানতার সাথে পরীক্ষা করা উচিত।

  5. যদি টেবিল এক্সে পরিবর্তনটি অন্যান্য সারণি বা সূচিগুলিকেও প্রভাবিত করে বা ট্রিগারগুলি স্কিমার মধ্যে দেখা হয়, তবে অন্যান্য টেবিল সূচীগুলি এবং দর্শনগুলিও সংশোধন করতে আপডেট আপডেটের স্টেটমেন্ট চালান। উদাহরণস্বরূপ, যদি কোনও কলামের নাম পরিবর্তিত হয়, সমস্ত বিদেশী KEY সীমাবদ্ধতা, ট্রিগার, সূচক এবং column কলামটি উল্লেখ করে এমন ভিউগুলি সংশোধন করতে হবে।

    সতর্কতা: আবারও, স্ক্লাইট_মাস্টার সারণিতে এইভাবে পরিবর্তন করা ডেটাবেসটিকে দুর্নীতিগ্রস্ত এবং অপঠনযোগ্য রেন্ডার করে যদি পরিবর্তনতে কোনও ত্রুটি থাকে। গুরুত্বপূর্ণ তথ্য সম্বলিত একটি ডেটাবেজে এটি ব্যবহারের আগে এই সম্পূর্ণ প্রক্রিয়াটি যত্ন সহকারে পরীক্ষা করুন এবং এই পদ্ধতিটি চালানোর আগে গুরুত্বপূর্ণ ডাটাবেসের ব্যাকআপ কপি তৈরি করুন।

  6. PRAGMA স্কিমা_ভার্সন = এক্স ব্যবহার করে স্কিমা সংস্করণ নম্বর বৃদ্ধি করুন যেখানে উপরের পদক্ষেপ 2 তে পাওয়া পুরানো স্কিমা সংস্করণ নম্বরের চেয়ে এক্স আরও বেশি।

  7. PRAGMA Writable_schema = বন্ধ ব্যবহার করে স্কিমা সম্পাদনা অক্ষম করুন।

  8. (Alচ্ছিক) স্কিমা পরিবর্তনগুলি ডেটাবেসকে ক্ষতিগ্রস্থ করেনি তা যাচাই করতে PRAGMA সততা_চেক চালান।

  9. উপরের 1 ধাপে লেনদেন শুরু হয়েছে বলে প্রতিশ্রুতিবদ্ধ।


PRAGMA সততা_ চেক স্কিমার সাথে কোনও ত্রুটি বাছাই করে না।
গ্রেমেটার

আর তাতে সমস্যা কী?
মোহাম্মদ ইয়াহিয়া

1

একটি বিকল্প, যদি আপনার এটি একটি চিমটি দিয়ে শেষ করা প্রয়োজন হয়, এবং যদি আপনার প্রাথমিক কলামটি একটি ডিফল্ট দিয়ে তৈরি করা হয় তবে তা হল যে নতুন কলামটি আপনি চান তা তৈরি করুন, এতে সামগ্রীগুলি অনুলিপি করুন এবং মূলত পুরানো কলামটি "পরিত্যাগ করুন" (এটি স্থায়ী থাকে) উপস্থিত, তবে আপনি কেবল এটি ব্যবহার / আপডেট করবেন না ইত্যাদি)

উদা:

alter table TABLE_NAME ADD COLUMN new_column_name TYPE NOT NULL DEFAULT '';
update TABLE_NAME set new_column_name = old_column_name;
update TABLE_NAME set old_column_name = ''; -- abandon old column, basically

এটি একটি কলামের পিছনে ফেলেছে (এবং এটি যদি নল নয়, তবে একটি ডিফল্ট ছাড়াই তৈরি করা হয়েছিল, তবে ভবিষ্যতের সন্নিবেশগুলি এটি এড়ানো যায় তা ব্যর্থ হতে পারে), তবে যদি এটি কেবল একটি ছুঁড়ে ফেলা টেবিল হয় তবে ট্রেড অফগুলি গ্রহণযোগ্য হতে পারে। অন্যথায় এখানে উল্লিখিত অন্য উত্তরগুলির একটি, বা একটি আলাদা ডাটাবেস ব্যবহার করুন যা কলামগুলির নাম পরিবর্তন করতে দেয়।



-3

sqlite3 yourdb .dump> /tmp/db.txt
সম্পাদনা /tmp/db.txt কলামের নাম পরিবর্তন করুন লাইন তৈরি করুন
sqlite2 yourdb2 </tmp/db.txt এমভি
/ সরান yourdb2 yourdb


3
আপনার উত্তরটি কোনও তথ্য সরবরাহ করে না, কেন আপনার মনে হয় যে এটি কাজ করবে বা আপনি যদি এটি চালায় তবে কী ঘটবে তা নিয়ে কোনও অতিরিক্ত তথ্য ছাড়াই একগুচ্ছ কোড / নির্দেশাবলী থুথু
ছুঁড়েছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.