এসকিউএলাইট প্রাথমিক কী যোগ করুন


104

আমি স্টেটমেন্টের CREATE TABLE ASভিত্তিতে একটি টেবিল তৈরি করতে সিনট্যাক্স ব্যবহার করে স্ক্লাইটে একটি সারণী তৈরি করেছি SELECT। এখন এই টেবিলটির কোনও প্রাথমিক কী নেই তবে আমি একটি যুক্ত করতে চাই।

এক্সিকিউটিং ALTER TABLE table_name ADD PRIMARY KEY(col1, col2,...)একটি সংশ্লেষ ত্রুটি দেয় "PRIMARY কাছাকাছি"

টেবিল তৈরির সময় বা পরে স্ক্লাইটে প্রাথমিক কী যুক্ত করার কোনও উপায় আছে কি?

"সৃষ্টির সময়" বলতে আমি বোঝাতে চাইছি সৃষ্টির সাথে CREATE TABLE AS


4
আপনি ডাটাবেস সম্পাদনার জন্য যে কোনও ডিবি ব্রাউজার ব্যবহার করতে পারেন। তারা টেবিলগুলি মুছে ফেলছে এবং তৈরি করছে। তবে আমরা এটি নিয়ে মাথা ঘামাতে চাই না। আপনি যে কোনও ওএসের জন্য ডিবি ব্রাউজারটি এখান থেকে ডাউনলোড করতে পারেন sqlitebrowser.org
ভিচু

উত্তর:


123

এসকিউএলাইট সারণীগুলি তৈরির পরে আপনি কোনও উল্লেখযোগ্য উপায়ে পরিবর্তন করতে পারবেন না। গৃহীত প্রস্তাবিত সমাধানটি হ'ল সঠিক প্রয়োজনীয়তা সহ একটি নতুন টেবিল তৈরি করা এবং এতে আপনার ডেটা অনুলিপি করা, তারপরে পুরানো টেবিলটি ফেলে দিন।

এখানে এই সম্পর্কে অফিসিয়াল ডকুমেন্টেশন: http://sqlite.org/faq.html#q11


7
এই লিঙ্কটি ( sqlite.org/omitted.html ) আরও বিশদে কী বাদ পড়েছিল তা ব্যাখ্যা করে।
মার্টিন ভেলিজ

4
তবে আমরা নতুন কলামগুলি যোগ করতে পারি
umesh


4
এটি যে আপনি টেবিল সৃষ্টি পরে একটি পি কে যোগ করতে পারবেন না কিন্তু আপনি এমন একটি সূচক যোগ করতে পারেন অদ্ভুত ( CREATE UNIQUE INDEX pkName ON tableName(columnName)) যখন ডিবি মত অবকাঠামো মাইক্রোসফট এসকিউএল এর Smo আসলে করতে আপনি একটি পি কে যোগ করার পরে টেবিল তৈরি করা হয়েছে!
স্টিভসিংক

@deFreitas দয়া করে আমাদের উপর আপনার জ্ঞান দান করুন। স্পষ্টতই আপনি চান যে লোকেরা আপনাকে উত্তর বা এমন কোনও মন্তব্য প্রত্যাখ্যান করে যা তারা জানায়, তবে আপনার মন্তব্যটিতে শ্রেষ্ঠত্ব এবং প্রভাব ছড়িয়ে দেওয়ার আপাত অভিপ্রায় ছাড়া কোনও তথ্য নেই।
নাথান রিডলি

31

আপনি যতক্ষণ ব্যবহার করছেন CREATE TABLE, আপনি যদি কোনও একক ক্ষেত্রে প্রাথমিক কী তৈরি করে থাকেন তবে আপনি ব্যবহার করতে পারেন:

CREATE TABLE mytable (
field1 TEXT,
field2 INTEGER PRIMARY KEY,
field3 BLOB,
);

এর সাথে CREATE TABLE, আপনি এক বা একাধিক ক্ষেত্রে একটি প্রাথমিক কী তৈরি করতে সর্বদা নীচের পদ্ধতিটি ব্যবহার করতে পারেন :

CREATE TABLE mytable (
field1 TEXT,
field2 INTEGER,
field3 BLOB,
PRIMARY KEY (field2, field1)
);

তথ্যসূত্র: http://www.sqlite.org/lang_createtable.html

এই উত্তরটি সারণির পরিবর্তনের বিষয়টি চিহ্নিত করে না।


10

আমি স্ক্লাইট_মাস্টার টেবিলটি সরাসরি পরিবর্তন করে প্রাথমিক কী যুক্ত করার চেষ্টা করেছি। এই কৌশলটি কাজ করে বলে মনে হচ্ছে। এটি অবশ্যই একটি হ্যাক সমাধান।

সংক্ষেপে: টেবিলটিতে একটি নিয়মিত (অনন্য) সূচক তৈরি করুন, তারপরে স্কিমা লিখিতযোগ্য করুন এবং প্রাথমিক কী সূচক সনাক্তকরণের জন্য স্ক্লাইট দ্বারা সংরক্ষিত ফর্মটিতে সূচকের নাম পরিবর্তন করুন, (যেমন, স্ক্লাইট_আউটওইন্ডেক্স_এক্সএক্সএক্সএক্স, যেখানে XXX টেবিলের নাম) এবং স্কুল স্ট্রিংটি NULL এ সেট করুন। শেষ অবধি টেবিলে সংজ্ঞা নিজেই পরিবর্তন করুন। একটি পিটফাল: ডাটাবেস পুনরায় খোলা না হওয়া পর্যন্ত স্ক্লাইটটি সূচকের নাম পরিবর্তন দেখতে পাবে না। এটি ত্রুটির মতো মনে হচ্ছে তবে তীব্র নয় (এমনকি ডাটাবেসটি পুনরায় খোলা না করেই আপনি এটি ব্যবহার করতে পারেন)।

ধরুন টেবিলটি এমন দেখাচ্ছে:

CREATE TABLE tab1(i INTEGER, j INTEGER, t TEXT);

তারপরে আমি নিম্নলিখিতগুলি করেছি:

BEGIN;
CREATE INDEX pk_tab1 ON tab1(i,j);
pragma writable_schema=1;
UPDATE sqlite_master SET name='sqlite_autoindex_tab1_1',sql=null WHERE name='pk_tab1';
UPDATE sqlite_master SET sql='CREATE TABLE tab1(i integer,j integer,t text,primary key(i,j))' WHERE name='tab1';
COMMIT;

কিছু পরীক্ষা (স্ক্লাইট শেলের মধ্যে):

sqlite> explain query plan select * from tab1 order by i,j;
0|0|0|SCAN TABLE tab1 USING INDEX sqlite_autoindex_tab1_1
sqlite> drop index sqlite_autoindex_tab1_1;
Error: index associated with UNIQUE or PRIMARY KEY constraint cannot be dropped    

4
আপনি যদি এই ভুলটি করেন তবে কেবলমাত্র একটি সতর্কতা যা আপনি (যতদূর আমি বলতে পারি) আপনার সম্পূর্ণ ডাটাবেসটিকে অ্যাক্সেসযোগ্য করে তুলতে পারে। আমি চারপাশে খেলছিলাম এবং আমি দ্বিতীয় আপডেটের ক্যোয়ারিতে দুর্ঘটনাক্রমে WHERE ধারাটি মিস করি। এসকিউএলাইট এটি পছন্দ করেনি: পি
অ্যান্ড্রু ম্যাগি

7

SQLite মতে ডক্স টেবিল সৃষ্টি সম্পর্কে, ব্যবহার সারণি তৈরি মত নির্বাচিত সীমাবদ্ধতার ছাড়া প্রাথমিক কী ছাড়া একটি নতুন টেবিল তৈরি করে।

তবে ডকুমেন্টেশনে আরও বলা হয়েছে যে প্রাথমিক কী এবং অনন্য সূচিগুলি যৌক্তিকভাবে সমতুল্য ( সীমাবদ্ধতা বিভাগ দেখুন ):

বেশিরভাগ ক্ষেত্রে, অনন্য এবং প্রাথমিক মূল সীমাবদ্ধতাগুলি ডাটাবেসে একটি অনন্য সূচক তৈরি করে প্রয়োগ করা হয়। (ব্যতিক্রমগুলি রাউবিড টেবিল ছাড়া স্বতন্ত্র প্রাথমিক কী এবং প্রাথমিক কীগুলি রয়েছে)) সুতরাং, নিম্নলিখিত স্কিমাগুলি যুক্তিযুক্তভাবে সমতুল্য:

CREATE TABLE t1(a, b UNIQUE);

CREATE TABLE t1(a, b PRIMARY KEY);

CREATE TABLE t1(a, b);
CREATE UNIQUE INDEX t1b ON t1(b); 

সুতরাং, এমনকি যদি আপনি এসকিউএল পরিবর্তনের সিনট্যাক্সের মাধ্যমে আপনার টেবিলের সংজ্ঞা পরিবর্তন করতে না পারেন তবে আপনি অনন্য সূচক ব্যবহারের মাধ্যমে একই প্রাথমিক কী প্রভাবটি পেতে পারেন।

এছাড়াও, যে কোনও সারণীতে (সারিড সিনট্যাক্স ব্যতীত তৈরি হওয়া ব্যতীত) একটি অভ্যন্তরীণ পূর্ণসংখ্যা কলাম রয়েছে "রোউইড" হিসাবে। ডক্স অনুসারে, আপনি রেকর্ড সারণীগুলি পুনরুদ্ধার / সংশোধন করতে এই অভ্যন্তরীণ কলামটি ব্যবহার করতে পারেন।


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


3

ভূমিকা

এটি অ্যান্ড্রয়েড জাভা ভিত্তিক এবং এটি আপনার অ্যাপ্লিকেশন ভক্ত / গ্রাহকদের বিরক্ত না করে ডাটাবেস পরিবর্তন করার পক্ষে একটি ভাল উদাহরণ। এটি এসকিউএল এফএকিউ পৃষ্ঠা http://sqlite.org/faq.html#q11 এর ধারণার উপর ভিত্তি করে

সমস্যাটি

আমি খেয়াল করিনি যে আমার কোনও রশিদে একটি ক্রয়কৃত আইটেম মুছতে একটি সারি_নম্বার বা রেকর্ড_আইড সেট করা দরকার এবং একই সাথে আইটেমটির বারকোড নম্বরটি আইটেমটি মুছে ফেলার কী হিসাবে তৈরি করার ভেবে আমাকে বোকা বানিয়েছিল। আমি টেবিল রসিদ_বারকোডে একটি রশিদের বিশদ সংরক্ষণ করছি। এটিকে রেকর্ড_আইডি ছাড়াই বোঝা যাচ্ছে যদি আমি আইটেমটি বারকোডটি কী হিসাবে ব্যবহার করি তবে কোনও রশিদে একই আইটেমের সমস্ত রেকর্ড মুছতে পারে।

নোটিশ

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

এছাড়াও দয়া করে কোডটিতে মন্তব্যগুলি পড়তে ভুলবেন না।

কোড

আপনি যে কলামটি যুক্ত করতে চান তা অনুপস্থিত আছে কি না তা পরীক্ষা করার জন্য এটি 1 ম ক্লাসে একটি পদ্ধতি হিসাবে ব্যবহার করুন। আমরা কেবল টেবিলের রসিদ_বারকোড পরিবর্তনের প্রক্রিয়া পুনরাবৃত্তি না করার জন্য এটি করি। আপনার ক্লাসের অংশ হিসাবে এটি উল্লেখ করুন। পরবর্তী পদক্ষেপে আপনি দেখতে পাবেন আমরা কীভাবে এটি ব্যবহার করব।

public boolean is_column_exists(SQLiteDatabase mDatabase , String table_name,
String     column_name) {
    //checks if table_name has column_name
    Cursor cursor = mDatabase.rawQuery("pragma table_info("+table_name+")",null);
    while (cursor.moveToNext()){
    if (cursor.getString(cursor.getColumnIndex("name")).equalsIgnoreCase(column_name)) return true;
    }
    return false;
}

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

//mDatabase should be defined as a Class member (global variable) 
//for ease of access : 
//SQLiteDatabse mDatabase=SQLiteDatabase.openOrCreateDatabase(dbfile_path, null);
creation_query = " CREATE TABLE if not exists receipt_barcode ( ";
creation_query += "\n record_id        INTEGER PRIMARY KEY AUTOINCREMENT,";
creation_query += "\n rcpt_id INT( 11 )       NOT NULL,";
creation_query += "\n barcode VARCHAR( 255 )  NOT NULL ,";
creation_query += "\n barcode_price VARCHAR( 255 )  DEFAULT (0),";
creation_query += "\n PRIMARY KEY ( record_id ) );";
mDatabase.execSQL(creation_query);

//This is where the important part comes in regarding the question in this page:

//adding the missing primary key record_id in table receipt_barcode for older versions
        if (!is_column_exists(mDatabase, "receipt_barcode","record_id")){
            mDatabase.beginTransaction();
            try{
                Log.e("record_id", "creating");


                 creation_query="CREATE TEMPORARY TABLE t1_backup(";
                 creation_query+="record_id INTEGER        PRIMARY KEY AUTOINCREMENT,";
                 creation_query+="rcpt_id INT( 11 )       NOT NULL,";
                 creation_query+="barcode VARCHAR( 255 )  NOT NULL ,";
                 creation_query+="barcode_price VARCHAR( 255 )  NOT NULL DEFAULT (0) );";
                 mDatabase.execSQL(creation_query);

                 creation_query="INSERT INTO t1_backup(rcpt_id,barcode,barcode_price) SELECT rcpt_id,barcode,barcode_price  FROM receipt_barcode;";
                 mDatabase.execSQL(creation_query);

                 creation_query="DROP TABLE receipt_barcode;";
                 mDatabase.execSQL(creation_query);

                 creation_query="CREATE TABLE receipt_barcode (";
                 creation_query+="record_id INTEGER        PRIMARY KEY AUTOINCREMENT,";
                 creation_query+="rcpt_id INT( 11 )       NOT NULL,";
                 creation_query+="barcode VARCHAR( 255 )  NOT NULL ,";
                 creation_query+="barcode_price VARCHAR( 255 )  NOT NULL DEFAULT (0) );";
                 mDatabase.execSQL(creation_query);

                 creation_query="INSERT INTO receipt_barcode(record_id,rcpt_id,barcode,barcode_price) SELECT record_id,rcpt_id,barcode,barcode_price  FROM t1_backup;";
                 mDatabase.execSQL(creation_query);

                 creation_query="DROP TABLE t1_backup;";
                 mDatabase.execSQL(creation_query);


                 mdb.setTransactionSuccessful();
            } catch (Exception exception ){
                Log.e("table receipt_bracode", "Table receipt_barcode did not get a primary key (record_id");
                exception.printStackTrace();
            } finally {
                 mDatabase.endTransaction();
            }

1

আমার একই সমস্যা ছিল এবং আমি যে সর্বোত্তম সমাধানটি পেয়েছি তা হ'ল প্রথমে প্রাথমিক কী নির্ধারণ করে সারণী তৈরি করা এবং তারপরে বিবৃতিতে intoোকানো ব্যবহার করা।

CREATE TABLE mytable (
field1 INTEGER PRIMARY KEY,
field2 TEXT
);

INSERT INTO mytable 
SELECT field1, field2 
FROM anothertable;

বাল্ক সন্নিবেশকারীদের জন্য খারাপ ধারণা
পাইরেটঅ্যাপ

0

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

set databasePath to "~/Documents/Databases/example.db"
set tableOne to "separate" -- Table from which you are pulling data
set tableTwo to "merged" -- Table you are creating
set {tempCol, tempColEntry, permColEntry} to {{}, {}, {}}
set permCol to {"id integer primary key"}

-- Columns are created from single items  AND from the last item of a list
-- {{"a", "b", "c"}, "d", "e"} Columns "a" and "b" will be merged into a new column "c".  tableTwo will have columns "c", "d", "e"

set nonCoal to {"City", "Contact", "Names", {"Address 1", "Address", "address one", "Address1", "Text4", "Address 1"}, {"E-Mail", "E-Mail Address", "Email", "Email Address", "EmailAddress", "Email"}, {"Zip", "Zip Code", "ZipCode", "Zip"}, {"Telephone", "BusinessPhone", "Phone", "Work Phone", "Telephone"}, {"St", "State", "State"}, {"Salutation", "Mr/Ms", "Mr/s", "Salutations", "Sautation", "Salutation"}}

-- Build the COALESCE statements
repeat with h from 1 to count of nonCoal
set aColumn to item h of nonCoal
if class of aColumn is not list then
    if (count of words of aColumn) > 1 then set aColumn to quote & aColumn & quote
    set end of tempCol to aColumn
    set end of permCol to aColumn
else
    set coalEntry to {}
    repeat with i from 1 to count of aColumn
        set coalCol to item i of aColumn as string
        if (count of words of coalCol) > 1 then set coalCol to quote & coalCol & quote
        if i = 1 then
            set end of coalEntry to "TRIM(COALESCE(" & coalCol & ", '') || \" \" || "
        else if i < ((count of aColumn) - 1) then
            set end of coalEntry to "COALESCE(" & coalCol & ", '') || \" \" || "
        else if i = ((count of aColumn) - 1) then
            set as_Col to item (i + 1) of aColumn as string
            if (count of words of as_Col) > 1 then set as_Col to quote & as_Col & quote
            set end of coalEntry to ("COALESCE(" & coalCol & ", '')) AS " & as_Col) & ""
            set end of permCol to as_Col
        end if
    end repeat
    set end of tempCol to (coalEntry as string)
end if
end repeat

-- Since there are ", '' within the COALESCE statement, you can't use "TID" and "as string" to convert tempCol and permCol for entry into sqlite3. I rebuild the lists in the next block.
repeat with j from 1 to count of tempCol
if j < (count of tempCol) then
    set end of tempColEntry to item j of tempCol & ", "
    set end of permColEntry to item j of permCol & ", "
else
    set end of tempColEntry to item j of tempCol
    set end of permColEntry to item j of permCol
end if
end repeat
set end of permColEntry to ", " & item (j + 1) of permCol
set permColEntry to (permColEntry as string)
set tempColEntry to (tempColEntry as string)

-- Create the new table with an "id integer primary key" column
set createTable to "create table " & tableTwo & " (" & permColEntry & "); "
do shell script "sqlite3 " & databasePath & space & quoted form of createTable

-- Create a temporary table and then populate the permanent table
set createTemp to "create temp table placeholder as select " & tempColEntry & " from " & tableOne & ";  " & "insert into " & tableTwo & " select Null, * from placeholder;"
do shell script "sqlite3 " & databasePath & space & quoted form of createTemp

--export the new table as a .csv file
do shell script "sqlite3 -header -column -csv " & databasePath & " \"select * from " & tableTwo & " ; \"> ~/" & tableTwo & ".csv"

0

আমি মনে করি যে কলামে একটি সূচক যুক্ত করা একই প্রভাব পেতে পারে।


0
sqlite>  create table t(id int, col2 varchar(32), col3 varchar(8));
sqlite>  insert into t values(1, 'he', 'ha');
sqlite>
sqlite>  create table t2(id int primary key, col2 varchar(32), col3 varchar(8));
sqlite>  insert into t2 select * from t;
sqlite> .schema
CREATE TABLE t(id int, col2 varchar(32), col3 varchar(8));
CREATE TABLE t2(id int primary key, col2 varchar(32), col3 varchar(8));
sqlite> drop table t;
sqlite> alter table t2 rename to t;
sqlite> .schema
CREATE TABLE IF NOT EXISTS "t"(id int primary key, col2 varchar(32), col3 varchar(8));
sqlite>

0

এসকিউএলাইটের জন্য ডিবি ব্রাউজারের মতো সরঞ্জামটি ব্যবহার করুন, এটি টেবিলের> ডানদিকে পরিবর্তন করে পিকে, এআই যুক্ত করতে দেয়।

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