मैं SQLite डेटाबेस तालिका में एक कॉलम का नाम कैसे बदलूं?


296

मुझे एक SQLite डेटाबेस में कुछ तालिकाओं में कुछ स्तंभों का नाम बदलने की आवश्यकता होगी। मुझे पता है कि स्टैकओवरफ्लो पर पहले भी इसी तरह का सवाल पूछा जा चुका है, लेकिन यह सामान्य रूप से एसक्यूएल के लिए था, और SQLite के मामले का उल्लेख नहीं किया गया था।

ALTER टेबल के लिए SQLite प्रलेखन से , मैं इकट्ठा करता हूं कि इस तरह के "आसानी से" (यानी एक एकल तालिका विवरण) संभव नहीं है।

मैं सोच रहा था कि किसी को SQLite के साथ ऐसा करने का एक सामान्य SQL तरीका पता था।


आप इसे आसानी से sqlite के लिए db ब्राउज़र का उपयोग करके कर सकते हैं
मैट जी

1
कृपया इस उत्तर को स्वीकार किए जाने वाले स्टैकओवरफ़्लो के
इवान कैरोल

जवाबों:


66

यह सिर्फ 2018-09-15 (3.25.0) के साथ तय किया गया था

एन्हांसमेंट ALTER TABLEकमांड:

  • तालिका का उपयोग करके ALTER TABLEतालिका के भीतर स्तंभों का नाम बदलने के लिए समर्थन जोड़ें RENAME COLUMN oldname TO newname
  • तालिका का नाम बदलें सुविधा को ठीक करें ताकि यह ट्रिगर और विचारों में नामांकित तालिका के संदर्भों को भी अपडेट करे।

आप के तहत प्रलेखित नया सिंटैक्स पा सकते हैं 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-fiddle.com डेमो


Android समर्थन

लेखन के रूप में, एंड्रॉइड का एपीआई 27 SQLite पैकेज संस्करण 3.19 का उपयोग कर रहा है

एंड्रॉइड का उपयोग करने वाले वर्तमान संस्करण के आधार पर और यह अपडेट SQLite के 3.25.0 संस्करण में आ रहा है, मैं कहूंगा कि एंड्रॉइड में शामिल होने से पहले समर्थन के लिए आपको थोड़ा इंतजार (लगभग एपीआई 33) करना होगा।

और, फिर भी, यदि आपको एपीआई 33 से अधिक पुराने किसी भी संस्करण का समर्थन करने की आवश्यकता है, तो आप इसका उपयोग नहीं कर पाएंगे।


8
मैं एक एंड्रॉइड माइग्रेशन के लिए लागू कर रहा हूं और दुर्भाग्य से इंटेलीज एक चेतावनी दिखा रहा है कि यह एक वैध एसक्यूएल कमांड नहीं है। database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")कोलम को लाल रंग में रखा गया है और यह कहता है कि उम्मीद की जाती है कि उन्हें 'COLUMN' मिला है । दुर्भाग्य से एंड्रॉइड अभी भी SQLite संस्करण 3.19 पर है, यही वजह है कि यह मेरे लिए काम नहीं करता है।
एडम हर्विट्ज

1
संपादित: मैंने system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q1 पर पाया है , कि 1.0.109.x) वास्तव में SQLite 3.24 और System.D.D.Siteite का उपयोग कर रहा है। SQLite 3.25 का उपयोग करके इस महीने को रिहा करने का धोखा दिया गया है।
rychlmoj

1
FYI करें, दुर्भाग्य से यह अभी तक Android की SQLite लाइब्रेरी द्वारा लागू नहीं किया गया है । उम्मीद है कि वे जल्द ही अपडेट करेंगे।
एडम हर्विट्ज

3
मैंने एंड्रॉइड सपोर्ट के लिए एक सेक्शन जोड़ा है ताकि दूसरों को उनकी आशाओं को पूरा करने से रोका जा सके। एंड्रॉइड 27 के SQLite 3.19 के वर्तमान उपयोग के आधार पर, हमें इस सुविधा को एंड्रॉइड में जोड़ने से पहले मोटे तौर पर एपीआई 33 तक इंतजार करना होगा, और फिर भी यह केवल नवीनतम संस्करणों पर समर्थित होगा। आह।
जोशुआ पिंटर

1
@JoshuaPinter मेरा उत्तर देने के लिए धन्यवाद।
लुकाज़ स्ज़ोज़ा

448

कहो कि आपके पास एक मेज है और "colb" का नाम बदलकर "col_b" करने की आवश्यकता है:

पहले आप पुरानी तालिका का नाम बदलें:

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 (या ROLLBACK) में लपेटना चाहिए ताकि यह सुनिश्चित हो सके कि नाम बदलना या तो सफलतापूर्वक पूरा होता है या नहीं।
रोजर बिन्न्स

4
Android में ऐसा करने का इच्छुक कोई भी
SQLiteDatabase.beginTransaction

7
उत्तर में कोड में कुछ भी नहीं है जो सूचकांकों की प्रतिलिपि बनाता है। एक खाली तालिका बनाना और उसमें डेटा डालना केवल संरचना और डेटा की प्रतिलिपि बनाता है। यदि आप मेटाडेटा (सूचक, विदेशी चाबियाँ, बाधाएं आदि) चाहते हैं, तो आपको उन्हें प्रतिस्थापित तालिका पर बनाने के लिए बयान भी जारी करना होगा।
टॉम मेफील्ड

17
SQLite की .schemaकमांड CREATE TABLEमौजूदा टेबल बनाने वाले स्टेटमेंट को दिखाने के लिए आसान है । आप इसका आउटपुट ले सकते हैं, आवश्यकतानुसार संशोधित कर सकते हैं और नई तालिका बनाने के लिए इसे निष्पादित कर सकते हैं। यह आदेश CREATE INDEXसूचकांकों को बनाने के लिए आवश्यक आदेशों को भी दर्शाता है , जो थॉमस की चिंताओं को कवर करना चाहिए। बेशक, कुछ भी बदलने से पहले इस कमांड को चलाना सुनिश्चित करें।
माइक डीमोन

56

चारों ओर खोदते हुए, मुझे यह मल्टीप्लेट रिकॉर्डर (लिनक्स | मैक | विंडोज) एसक्यूएल के लिए डीबी ब्राउज़र नामक ग्राफिकल टूल मिला है जो वास्तव में एक को बहुत उपयोगकर्ता के अनुकूल तरीके से कॉलम का नाम बदलने की अनुमति देता है!

संपादित करें | संशोधित तालिका | तालिका का चयन करें | फ़ील्ड संपादित करें। क्लिक करें! देखा!

हालांकि, अगर कोई ऐसा करने का प्रोग्रामेटिक तरीका साझा करना चाहता है, तो मुझे यह जानकर खुशी होगी!


1
एक फ़ायरफ़ॉक्स ऐड-ऑन भी है जो समान काम करता है , उस कॉलम पर राइट क्लिक करें जिसे आप नाम बदलना चाहते हैं और "एडिट कॉलम" का चयन करें।
जैकब हैकर

1

यह अजीब है कि इसमें बहुत सारे वोट हैं। हम यहां प्रोग्रामिंग (कोड) के बारे में बात कर रहे हैं। आपने यहाँ भी यह उत्तर क्यों दिया?
15:25 पर यूज़र

2
मेरे प्रश्न में कोड के साथ ऐसा करने का कोई उल्लेख नहीं है। मैं सिर्फ यह जानना चाहता था कि किसी SQLite DB में एक कॉलम का नाम कैसे बदला जाए।
जॉइस

@ प्यार मैं तुमसे प्यार करता हूँ !!! (एक भाई की तरह) ने मुझे मैदान, आवाज में बदल दिया। मैंने SQL एक्सेस के लिए एक एमएस एक्सेस टेबल निर्यात किया था और एक क्षेत्र के सामने एक अंक था: 3YearLetterSent। विज़ुअल स्टूडियो ने मेज से कक्षा बनाई, लेकिन फ़ील्ड नाम के सामने "3" अंक पर चोक किया। मुझे यह पता है, बस नहीं देख रहा था।
जस्टजॉन

53

हालांकि यह सही है कि कोई भी COLUMN नहीं है, यदि आप केवल कॉलम का नाम बदलना चाहते हैं, तो NULL बाधा न डालें, या डेटा प्रकार को बदलें, आप निम्न आदेशों के सेट का उपयोग कर सकते हैं:

नोट: इन आदेशों में आपके डेटाबेस को भ्रष्ट करने की क्षमता है, इसलिए सुनिश्चित करें कि आपके पास एक बैकअप है

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 और DELETE कथनों का उपयोग करके बदला जा सकता है। चेतावनी: इस प्रचार का दुरुपयोग आसानी से एक भ्रष्ट डेटाबेस फ़ाइल में हो सकता है।

परिवर्तन तालिका
SQLite ALTER TABLE के सीमित उपसमूह का समर्थन करती है। SQLite में ALTER TABLE कमांड उपयोगकर्ता को एक तालिका का नाम बदलने या किसी मौजूदा तालिका में एक नया कॉलम जोड़ने की अनुमति देता है। एक स्तंभ का नाम बदलना, एक स्तंभ को हटाना, या एक तालिका से बाधाओं को जोड़ना या निकालना संभव नहीं है।

अन्य टेबल SYNTAX


3
खतरनाक, लेकिन फिर भी शायद सबसे सीधा-सीधा जवाब imo है।
टेक

2
हां बेहद तेज - खतरनाक का मतलब केवल यह है कि "सुनिश्चित करें कि आपके पास पहले बैकअप है"
नोह

6
Sqlite फ़ाइल प्रारूप बहुत सरल है और इसीलिए यह ऑपरेशन मान्य है। फ़ाइल प्रारूप में एक तालिका के बारे में जानकारी के केवल दो सेट होते हैं: सादा पाठ के रूप में वास्तविक सृजन आदेश, और पंक्तियाँ, जिनके मान क्रिएट कमांड से फ़ील्ड के क्रम में दिखाई दे रहे हैं। जिसका अर्थ है कि sqlite कोड डेटाबेस को खोलता है, यह प्रत्येक CREATE कमांड को पार्स करता है और मेमोरी में अपने कॉलम की जानकारी को गतिशील रूप से बनाता है। इसलिए, कोई भी कमांड जो क्रिएट कमांड को एक तरह से बदल देती है, जो समान संख्या में कॉलम के साथ समाप्त होती है, भले ही आप उनके प्रकार या बाधाओं को बदल दें।
थॉमस टेंपेलमैन

3
@ThomasTempelmann हालांकि, डेटासेट द्वारा पूरी नहीं की गई बाधाओं को जोड़ने से समस्याएं आएंगी क्योंकि क्वेरी प्लानर मानता है कि बाधाएं पकड़ती हैं।
फ़ूज

2
@ThomasTempelmann निकाला जा रहा है की कमी हमेशा ठीक है। बाधाओं को जोड़ना ठीक है अगर बाधा सभी पंक्तियों से संतुष्ट है लेकिन आपको निश्चित रूप से जांचने की आवश्यकता है।
फुज

18

हाल ही में मैं एक मेज नामित के साथ क्या करना है कि SQLite3 में था अंक colunms साथ आईडी, देशांतर, अक्षांश । Erroneusly, जब तालिका आयात किया गया था, जहां में संग्रहीत अक्षांश के लिए मूल्यों देशांतर स्तंभ और viceversa, एक स्पष्ट ठीक उन स्तंभों का नाम बदलने का होगा तो। तो चाल थी:

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;

मुझे आशा है कि यह आपके लिए उपयोगी होगा!


यह विधि उचित रूप से PK मान की प्रतिलिपि नहीं बनाती है और स्वचालित रूप से छिपे हुए पंक्ति कॉलम को बनाती है। जरूरी नहीं कि एक समस्या हो, लेकिन यह इंगित करना चाहता था क्योंकि यह मेरे लिए एक मुद्दा बन गया।
TPoschel

4
क्या "UPDATE अंक SET lon = lat, lat = lon?" करना आसान नहीं होगा?
kstep

1
यह उत्तर प्रक्रिया को सही ORDER में करता है। पहले अस्थायी तालिका बनाएं और इसे आबाद करें फिर मूल को नष्ट करें
20

14

Sqlite प्रलेखन उद्धृत करना :

SQLite सीमित तालिका के सीमित उपसमूह का समर्थन करता है। SQLite में ALTER TABLE कमांड उपयोगकर्ता को एक तालिका का नाम बदलने या किसी मौजूदा तालिका में एक नया कॉलम जोड़ने की अनुमति देता है। एक स्तंभ का नाम बदलना, एक स्तंभ को हटाना, या एक तालिका से बाधाओं को जोड़ना या निकालना संभव नहीं है।

आप जो भी कर सकते हैं, वह है, नए लेआउट के साथ एक नई तालिका बनाएं SELECT * FROM old_table, और आपके द्वारा प्राप्त मूल्यों के साथ नई तालिका भरें।


7

सबसे पहले, यह उन चीजों में से एक है जो मुझे आश्चर्य के साथ चेहरे पर थप्पड़ मारता है: एक स्तंभ का नाम बदलने के लिए एक पूरी तरह से नई तालिका बनाने और पुराने तालिका से नई तालिका में डेटा की प्रतिलिपि बनाने की आवश्यकता होती है ...

जीयूआई मैं SQLite संचालन करने के लिए उतरा है बेस है । यह एक निफ्टी लॉग विंडो मिली है जो सभी कमांड को निष्पादित करती है। आधार के माध्यम से एक स्तंभ का नाम बदलना आवश्यक आदेशों के साथ लॉग विंडो को पॉप्युलेट करता है:

आधार लॉग विंडो

फिर इन्हें आसानी से कॉपी और पेस्ट किया जा सकता है, जहाँ आपको इनकी आवश्यकता हो सकती है। मेरे लिए, वह एक ActiveAndroid माइग्रेशन फ़ाइल में है। एक अच्छा स्पर्श, साथ ही, यह है कि प्रतिलिपि किए गए डेटा में केवल SQLite कमांड शामिल हैं, टाइमस्टैम्प आदि नहीं।

उम्मीद है, कि कुछ लोगों का समय बचाता है।


FYI करें, यदि आप ActiveAndroid का उपयोग कर रहे हैं , तो आप और लाइनों को छोड़ सकते हैं , क्योंकि ActiveAndroid खुद से संभालता है। BEGIN TRANSACTION;COMMIT;
जोशुआ पिंटर

6

मामले 1: SQLite 3.25.0+

SQLite का केवल संस्करण 3.25.0 नाम बदलने वाले कॉलम का समर्थन करता है। यदि आपका डिवाइस इस आवश्यकता को पूरा कर रहा है, तो चीजें काफी सरल हैं। नीचे दी गई क्वेरी आपकी समस्या का समाधान करेगी:

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

मामले 2: SQLite पुराने संस्करण

आपको परिणाम प्राप्त करने के लिए एक अलग दृष्टिकोण का पालन करना होगा जो थोड़ा मुश्किल हो सकता है

उदाहरण के लिए, यदि आपके पास इस तरह की एक तालिका है:

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;

इन चार चरणों के साथ आप किसी भी SQLite तालिका को मैन्युअल रूप से बदल सकते हैं। ध्यान रखें कि आपको नए टेबल पर भी किसी भी इंडेक्स, व्यूअर या ट्रिगर्स को फिर से बनाना होगा।


1
एंड्रॉइड स्टूडियो में 3.29.0 के लिए साइक्लाइट डेटाबेस संस्करण को अपग्रेड करने के लिए मैं एपीआई स्तर 28 का उपयोग कैसे करूं।
नैथानी सॉफ्टवेयर

SQLite संस्करण उस डिवाइस द्वारा परिभाषित किया गया है जिस पर ऐप काम करता है। यह डिवाइस पर निर्भर है।
फिनी मैथ्यू

1
पुराने sqlite का उपयोग करने वाले लोगों के लिए, ऊपर के चार चरण हतोत्साहित हैं। 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};

पुराने कॉलम की सामग्री को नए कॉलम COLNew में कॉपी करें।

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

नोट: कोष्ठक उपरोक्त पंक्ति में आवश्यक हैं।


2

जैसा कि पहले उल्लेख किया गया है, एक उपकरण SQLite डेटाबेस ब्राउज़र है, जो ऐसा करता है। Lyckily, यह टूल उपयोगकर्ता या एप्लिकेशन द्वारा किए गए सभी ऑपरेशनों का लॉग रखता है। एक बार ऐसा करने और एप्लिकेशन लॉग को देखने पर, आपको कोड शामिल दिखाई देगा। आवश्यकतानुसार क्वेरी और पेस्ट कॉपी करें। मेरे लिए काम किया। उम्मीद है की यह मदद करेगा


2

आधिकारिक दस्तावेज से

एक सरल और तेज प्रक्रिया वैकल्पिक रूप से कुछ परिवर्तनों के लिए उपयोग की जा सकती है जो किसी भी तरह से ऑन-डिस्क सामग्री को प्रभावित नहीं करते हैं। निम्नलिखित सरल प्रक्रिया CHECK या FOREIGN KEY या NOT NULL बाधाओं को दूर करने, स्तंभों का नाम बदलने , या स्तंभ पर डिफ़ॉल्ट मान जोड़ने या हटाने या बदलने के लिए उपयुक्त है।

  1. एक लेनदेन शुरू करें।

  2. वर्तमान स्कीमा संस्करण संख्या निर्धारित करने के लिए PRAGMA स्कीमा_वर्ष को चलाएँ। यह संख्या नीचे चरण 6 के लिए आवश्यक होगी।

  3. PRAGMA writable_schema = ON का उपयोग करके स्कीमा संपादन सक्रिय करें।

  4. Sqlite_master तालिका में तालिका X की परिभाषा बदलने के लिए एक UPDATE कथन चलाएँ: UPDATE sqlite_master SET sql = ... जहाँ = 'तालिका' और नाम = 'X' टाइप करें;

    सावधानी: इस तरह sqlite_master तालिका में परिवर्तन करना डेटाबेस को भ्रष्ट और अपठनीय बना देगा यदि परिवर्तन में एक वाक्यविन्यास त्रुटि है। यह सुझाव दिया जाता है कि महत्वपूर्ण डेटा वाले डेटाबेस पर इसका उपयोग करने से पहले UPDATE स्टेटमेंट का सावधानीपूर्वक परीक्षण एक अलग रिक्त डेटाबेस पर किया जाए।

  5. यदि तालिका X में परिवर्तन अन्य तालिकाओं या अनुक्रमणियों को भी प्रभावित करता है या स्कीमा के भीतर ट्रिगर्स विचार हैं, तो उन अन्य तालिकाओं और विचारों को भी संशोधित करने के लिए अद्यतन विवरण चलाएँ। उदाहरण के लिए, यदि किसी स्तंभ का नाम बदलता है, तो सभी स्तंभ कुंजी, ट्रिगर, अनुक्रमित और उस स्तंभ को संदर्भित करने वाले विचारों को संशोधित किया जाना चाहिए।

    सावधानी: एक बार फिर, इस तरह sqlite_master तालिका में परिवर्तन करना डेटाबेस को भ्रष्ट और अपठनीय बना देगा यदि परिवर्तन में कोई त्रुटि है। इस पूरी प्रक्रिया का सावधानीपूर्वक एक अलग परीक्षण डेटाबेस पर परीक्षण करें इससे पहले कि महत्वपूर्ण डेटा वाले डेटाबेस पर इसका उपयोग करें और / या इस प्रक्रिया को चलाने से पहले महत्वपूर्ण डेटाबेस की बैकअप प्रतियां बनाएं।

  6. PRAGMA स्कीमा_version = X का उपयोग करके स्कीमा संस्करण संख्या बढ़ाएँ जहाँ X ऊपर दिए गए चरण 2 में पाए गए पुराने स्कीमा संस्करण संख्या से एक अधिक है।

  7. PRAGMA writable_schema = OFF का उपयोग करके स्कीमा संपादन अक्षम करें।

  8. (वैकल्पिक) यह सत्यापित करने के लिए कि स्कीमा परिवर्तन ने डेटाबेस को नुकसान नहीं पहुँचाया, 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

यह एक स्तंभ के पीछे छोड़ देता है (और यदि यह बिना NULL के नहीं बल्कि डिफ़ॉल्ट रूप से बनाया गया था, तो भविष्य के आवेषण जो इसे अनदेखा करते हैं, वह विफल हो सकता है), लेकिन अगर यह सिर्फ एक फेंक तालिका है, तो ट्रेडऑफ़ स्वीकार्य हो सकता है। अन्यथा यहां वर्णित अन्य उत्तरों में से एक का उपयोग करें, या एक अलग डेटाबेस जो कॉलम का नाम बदलने की अनुमति देता है।



-3

sqlite3 yourdb .dump> /tmp/db.txt
संपादित करें /tmp/db.txt स्तंभ पंक्ति में नाम बदलें
sqlite2 yourdb2 </tmp/db.txt
mv / yourbb2 yourdb स्थानांतरित करें


3
आप जवाब देते हैं कि कोई जानकारी नहीं देता है, कोड / निर्देशों का एक गुच्छा बिना किसी अतिरिक्त जानकारी के बाहर थूकता है कि आपको क्यों लगता है कि यह काम करेगा या यदि आप इसे चलाते हैं तो क्या होगा
RGLSV
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.