উত্তর:
আপনার কাছে দুটি বিকল্প রয়েছে। প্রথমত, আপনি কেবল নিম্নলিখিতগুলির সাথে একটি নতুন কলাম যুক্ত করতে পারেন:
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
দ্বিতীয়ত এবং আরও জটিলভাবে, তবে কলামটি যেখানে আপনি এটি চান সেখানে রাখবেন, টেবিলটির নতুন নামকরণ করা হবে:
ALTER TABLE {tableName} RENAME TO TempOldTable;
তারপরে নিখোঁজ কলামটি দিয়ে নতুন টেবিলটি তৈরি করুন:
CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);
এবং এটি পুরানো ডেটা দিয়ে বিশিষ্ট করুন:
INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;
তারপরে পুরানো টেবিলটি মুছুন:
DROP TABLE TempOldTable;
আমি অনেকটা দ্বিতীয় বিকল্পটিকে পছন্দ করব, কারণ এটি আপনাকে যদি প্রয়োজন হয় তবে পুরোপুরি নামকরণের অনুমতি দেবে।
PRAGMA foreign_keys = ON;
(দেখুন sqlite.org/foreignkeys.html#fk_enable )
আপনি কলাম জুড়তে না মধ্যে অন্যান্য কলাম SQL এর যে, আপনি শুধু তাদের যোগ করুন। তাদের যেখানে রাখা হয়েছে তা সম্পূর্ণভাবে ডিবিএমএসের উপর নির্ভর করে। কলামগুলি সঠিক ক্রমে বেরিয়ে আসে তা নিশ্চিত করার সঠিক স্থানটি আপনি যখন select
সেগুলি করেন।
অন্য কথায়, আপনি যদি ক্রমে সেগুলি চান {name,colnew,qty,rate}
, আপনি ব্যবহার করুন:
select name, colnew, qty, rate from ...
এসকিউএলাইট সহ আপনার ব্যবহার করা দরকার, এটির alter table
একটি উদাহরণ:
alter table mytable add column colnew char(50)
SELECT * FROM mytable
?
select *
। এটি কখনও কখনও এমন প্রোগ্রামগুলির পক্ষে কার্যকর যেগুলি টেবিলগুলি আবিষ্কার করতে চায় তবে ব্যবহারের বিশাল সংখ্যাগরিষ্ঠতার জন্য আপনাকে স্পষ্টভাবে নির্দিষ্ট করে বলা উচিত যে আপনি কী চান এবং তাই আপনি এটি যে ক্রমে চান সেগুলি স্পষ্ট করে নির্দিষ্ট করে দেওয়া উচিত।
এসকিউএলাইটে অল্টার টেবল সমর্থন সীমিত রয়েছে যা আপনি কোনও টেবিলের শেষে একটি কলাম যুক্ত করতে বা কোনও টেবিলের নাম পরিবর্তন করতে পারেন।
আপনি যদি কোনও টেবিলের কাঠামোর আরও জটিল পরিবর্তন করতে চান তবে আপনাকে টেবিলটি পুনরায় তৈরি করতে হবে। আপনি অস্থায়ী টেবিলটিতে বিদ্যমান ডেটা সংরক্ষণ করতে পারেন, পুরানো টেবিলটি ফেলে দিতে পারেন, নতুন টেবিলটি তৈরি করতে পারেন, তারপরে অস্থায়ী সারণী থেকে ডেটাটি অনুলিপি করতে পারেন।
উদাহরণস্বরূপ, ধরুন আপনার কাছে "t1" নামের একটি সারণী রয়েছে যার সাথে কলামগুলির নাম "a" এবং "c" রয়েছে এবং আপনি এই টেবিলটি থেকে "b" কলামটি সন্নিবেশ করতে চান। নিম্নলিখিত পদক্ষেপগুলি কীভাবে এটি করা যেতে পারে তা চিত্রিত করে:
BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;
এখন আপনি আপনার নতুন ডেটা likeোকাতে প্রস্তুত:
UPDATE t1 SET b='blah' WHERE a='key'
INSERT INTO t1 SELECT a,c FROM t1_backup;
ত্রুটির কারণ ঘটায়: "টেবিল টি 1 এর 3 টি কলাম রয়েছে তবে 2 টি মান সরবরাহ করা হয়েছিল: IN1ERT INTO T1 নির্বাচন করুন, সি থেকে T1_backup;"; সঠিক লাইনটি হওয়া উচিতINSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};
এই আপডেটটি নাল মানটি হ্যান্ডেল করার জন্য আপনার প্রয়োজন হিসাবে একটি ডিফল্ট মান ইনপুট করা প্রয়োজন। আপনার ক্ষেত্রে যেমন আপনার SELECT
জিজ্ঞাসা কল করা দরকার এবং প্যাক্সিয়াবলো ইতিমধ্যে বলেছিলেন তেমনই আপনি কলামগুলির ক্রম পাবেন :
SELECT name, colnew, qty, rate FROM{tablename}
এবং আমার মতে, আপনার কলামটির নাম কার্সার থেকে মান পেতে:
private static final String ColNew="ColNew";
String val=cursor.getString(cursor.getColumnIndex(ColNew));
সুতরাং সূচক পরিবর্তন হলে আপনার অ্যাপ্লিকেশন কোনও সমস্যার মুখোমুখি হবে না।
এটি এই অর্থে নিরাপদ উপায় যে অন্যথায়, আপনি যদি ব্যবহার করছেন CREATE temptable
বা RENAME table
বা CREATE
, সাবধানতার সাথে পরিচালনা না করা হয় তবে ডেটা হ্রাস হওয়ার উচ্চ সম্ভাবনা রয়েছে, উদাহরণস্বরূপ, যেখানে ব্যাটারিটি চালু হওয়ার সময় আপনার লেনদেন হয়।
আমি একই সমস্যার মুখোমুখি হয়েছিলাম এবং মন্তব্যে উল্লিখিত হিসাবে গৃহীত উত্তরে প্রস্তাবিত দ্বিতীয় পদ্ধতিটি বিদেশী কীগুলি নিয়ে কাজ করার সময় সমস্যা হতে পারে।
আমার কাজের ভিত্তিটি INSERT বিবৃতিতে কলামের নাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করে একটি বেকার ফাইলটিতে ডাটাবেস রফতানি করা। আমি এটি এসকিউএলাইটের জন্য ডিবি ব্রাউজার ব্যবহার করে করি যা এর জন্য একটি সুবিধাজনক বৈশিষ্ট্য রয়েছে। এর পরে আপনাকে কেবল সারণী বিবরণী তৈরি করতে হবে এবং নতুন কলামটি আপনি যেখানে চান সন্নিবেশ করতে হবে এবং ডিবিটি পুনরায় তৈরি করতে হবে।
সিস্টেমের মতো * নিক্সে লাইনের পাশাপাশি কিছু হয়
cat db.sql | sqlite3 database.db
আমি জানি না এটি খুব বড় ডেটাবেসগুলির সাথে কতটা সম্ভব সম্ভব তবে এটি আমার ক্ষেত্রে কার্যকর হয়েছিল।