স্ক্লাইটে টেবিলের মধ্যে নতুন কলাম sertোকান?


354

আমি কলাম সহ একটি টেবিল আছে name, qty, rate। এখন আমাকে এবং কলামগুলির COLNewমধ্যে একটি নতুন কলাম যুক্ত করতে হবে । আমি কীভাবে দুটি কলামের মধ্যে একটি নতুন কলাম যুক্ত করব?nameqty

উত্তর:


677

আপনার কাছে দুটি বিকল্প রয়েছে। প্রথমত, আপনি কেবল নিম্নলিখিতগুলির সাথে একটি নতুন কলাম যুক্ত করতে পারেন:

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;

আমি অনেকটা দ্বিতীয় বিকল্পটিকে পছন্দ করব, কারণ এটি আপনাকে যদি প্রয়োজন হয় তবে পুরোপুরি নামকরণের অনুমতি দেবে।


26
আমি প্রথম বিকল্পের জন্য যাব, এবং সারণি বিকল্পের বাইরে ডিফল্ট বিকল্পটি ব্যবহার করব ALTER TABLE {tableName} COLUMN COLNew {টাইপ করুন FA ডিফল্ট {defaultValue}; আরও গুরুত্বপূর্ণ: (আপনি কলামগুলি কেন অর্ডার করতে চান তা ভেবে ..) প্রতিটি রেকর্ড ক্রিয়ায় (যেমন সন্নিবেশ করা বা যুক্ত করা) সর্বদা কলামের নাম ব্যবহার করুন, এইভাবে, আপনি সারণী পরিবর্তন করার পরে আপনার কোডটিতে কিছু ভুল পাবেন না।
michel.iamit

5
উপায় দ্বারা: ডিফল্ট মানটি কিছু ক্ষেত্রের জন্য ALTER TABLE এ যোগ করা যায় না: sqlite.org/lang_altertable.html
michel.iamit

9
সূচীগুলি পুনরায় তৈরি করতে ভুলবেন না
জান তুরো ň

5
আপনাকে ট্রিগারগুলিও পুনরায় তৈরি করতে হবে
ক্রিস্টোফার কে।

7
বিদেশী কীগুলির দ্বারা সৃষ্ট সম্ভাব্য প্রতিবন্ধকতা লঙ্ঘনটি ভুলে যাবেন না: "... তবে বিদেশী কী পদক্ষেপ বা সীমাবদ্ধতা লঙ্ঘন করতে পারে।" (দেখুন sqlite.org/foreignkeys.html#fk_schemacommands ); কাজের ভিত্তিতে আপনি এদিকে বিদেশী কীগুলি অক্ষম করতে পারবেন: PRAGMA foreign_keys = ON;(দেখুন sqlite.org/foreignkeys.html#fk_enable )
ত্রিনিমন

112

আপনি কলাম জুড়তে না মধ্যে অন্যান্য কলাম SQL এর যে, আপনি শুধু তাদের যোগ করুন। তাদের যেখানে রাখা হয়েছে তা সম্পূর্ণভাবে ডিবিএমএসের উপর নির্ভর করে। কলামগুলি সঠিক ক্রমে বেরিয়ে আসে তা নিশ্চিত করার সঠিক স্থানটি আপনি যখন selectসেগুলি করেন।

অন্য কথায়, আপনি যদি ক্রমে সেগুলি চান {name,colnew,qty,rate}, আপনি ব্যবহার করুন:

select name, colnew, qty, rate from ...

এসকিউএলাইট সহ আপনার ব্যবহার করা দরকার, এটির alter tableএকটি উদাহরণ:

alter table mytable add column colnew char(50)

2
SELECT * FROM mytable?
EML

নতুন কলামের বিদ্যমান সারিগুলিতে যদি আমরা এটি নির্দিষ্ট না করি তবে ডিফল্ট মান সেটটি কী?
যাকোব

12
এমন খুব কম ব্যবহারের কেস রয়েছে যেখানে আপনার করা উচিত select *। এটি কখনও কখনও এমন প্রোগ্রামগুলির পক্ষে কার্যকর যেগুলি টেবিলগুলি আবিষ্কার করতে চায় তবে ব্যবহারের বিশাল সংখ্যাগরিষ্ঠতার জন্য আপনাকে স্পষ্টভাবে নির্দিষ্ট করে বলা উচিত যে আপনি কী চান এবং তাই আপনি এটি যে ক্রমে চান সেগুলি স্পষ্ট করে নির্দিষ্ট করে দেওয়া উচিত।
প্যাক্সিডিয়াবলো

4
এটি কীভাবে "গৃহীত উত্তর" নয় এটি উন্মাদ। মূল প্রশ্নটি নিজেই কোনও আরডিবিএমএস কীভাবে কাজ করে তার সম্পূর্ণ বোঝার অভাব প্রদর্শন করে।
ভাদা পোচি

12

আপনি ক্যোয়ারী সহ নতুন কলাম যুক্ত করতে পারেন

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

তবে এটি বিদ্যমান কলামগুলির মধ্যে নয়, শেষে যুক্ত করা হবে।


11

এসকিউএলাইটে অল্টার টেবল সমর্থন সীমিত রয়েছে যা আপনি কোনও টেবিলের শেষে একটি কলাম যুক্ত করতে বা কোনও টেবিলের নাম পরিবর্তন করতে পারেন।

আপনি যদি কোনও টেবিলের কাঠামোর আরও জটিল পরিবর্তন করতে চান তবে আপনাকে টেবিলটি পুনরায় তৈরি করতে হবে। আপনি অস্থায়ী টেবিলটিতে বিদ্যমান ডেটা সংরক্ষণ করতে পারেন, পুরানো টেবিলটি ফেলে দিতে পারেন, নতুন টেবিলটি তৈরি করতে পারেন, তারপরে অস্থায়ী সারণী থেকে ডেটাটি অনুলিপি করতে পারেন।

উদাহরণস্বরূপ, ধরুন আপনার কাছে "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;
JnLlnd

5
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, সাবধানতার সাথে পরিচালনা না করা হয় তবে ডেটা হ্রাস হওয়ার উচ্চ সম্ভাবনা রয়েছে, উদাহরণস্বরূপ, যেখানে ব্যাটারিটি চালু হওয়ার সময় আপনার লেনদেন হয়।


4

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

আমার কাজের ভিত্তিটি INSERT বিবৃতিতে কলামের নাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করে একটি বেকার ফাইলটিতে ডাটাবেস রফতানি করা। আমি এটি এসকিউএলাইটের জন্য ডিবি ব্রাউজার ব্যবহার করে করি যা এর জন্য একটি সুবিধাজনক বৈশিষ্ট্য রয়েছে। এর পরে আপনাকে কেবল সারণী বিবরণী তৈরি করতে হবে এবং নতুন কলামটি আপনি যেখানে চান সন্নিবেশ করতে হবে এবং ডিবিটি পুনরায় তৈরি করতে হবে।

সিস্টেমের মতো * নিক্সে লাইনের পাশাপাশি কিছু হয়

cat db.sql | sqlite3 database.db

আমি জানি না এটি খুব বড় ডেটাবেসগুলির সাথে কতটা সম্ভব সম্ভব তবে এটি আমার ক্ষেত্রে কার্যকর হয়েছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.