স্ক্লাইটে কোনও স্বয়ংবৃদ্ধি আছে?


109

আমি একটি স্বয়ংক্রিয় বৃদ্ধিশীল সঙ্গে একটি সারণি তৈরি করার চেষ্টা করছি primary keySqlite3 । এটি সত্যই সম্ভব কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে আমি কেবলমাত্র অন্যান্য ক্ষেত্রকেই মনোনীত করতে চাই।

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

CREATE TABLE people (id integer primary key auto increment, first_name varchar(20), last_name varchar(20));

তারপরে, যখন আমি কোনও মূল্য যুক্ত করি, তখন আমি কেবল এটি করতে হবে বলে আশা করি:

INSERT INTO people
VALUES ("John", "Smith");

এটা কি সম্ভব?

আমি দৌড়াচ্ছি sqlite3অধীনে cygwinউইন্ডোজ 7 হবে।

উত্তর:


166

আপনি নিখরচায় একটি পান, যার নাম ROWID। এটি প্রতিটি এসকিউএলাইট টেবিলের মধ্যে রয়েছে আপনি এটি চাইবেন বা না করুন।

আপনি যদি প্রবন্ধের মূল কী জাতীয় টাইপের একটি কলাম অন্তর্ভুক্ত করেন তবে সেই কলামটি স্বয়ংক্রিয় ROWID কলামে (এর জন্য একটি উপ নাম) পয়েন্ট করবে।

ROWID (আপনি যে নামেই ডাকেন) একটি মান নির্ধারিত হয় যখনই আপনি সারি সন্নিবেশ করান, যেমনটি আপনি প্রত্যাশা করেন। আপনি যদি স্পষ্টতই INSERT এ একটি নন-নুল মান নির্ধারণ করেন তবে এটি স্বয়ংক্রিয়-বৃদ্ধির পরিবর্তে সেই নির্দিষ্ট মানটি পাবে। আপনি যদি স্পষ্টভাবে INSERT এ NULL এর একটি মান নির্ধারণ করেন তবে এটি পরবর্তী স্বয়ংক্রিয়-বৃদ্ধি মান পাবে।

এছাড়াও, আপনার এড়াতে চেষ্টা করা উচিত:

 INSERT INTO people VALUES ("John", "Smith");

আর ব্যবহার করুন

 INSERT INTO people (first_name, last_name) VALUES ("John", "Smith");

পরিবর্তে. প্রথম সংস্করণটি খুব নাজুক - আপনি যদি কখনও নিজের টেবিল সংজ্ঞায় কলামগুলি যুক্ত করেন, সরিয়ে ফেলেন বা মুছে ফেলেন তবে INSERT হয় ব্যর্থ হবে বা ভুল ডেটা তৈরি করবে (ভুল কলামগুলির মান সহ)।


53
ROWID সত্যিকারের স্ব-স্ব-সংশোধন হিসাবে একেবারে সমান নয় কারণ সেম মানটি একাধিকবার উত্পন্ন হতে পারে। উদাহরণস্বরূপ, খালি টেবিলের সাহায্যে 3 টি সারি সন্নিবেশ করা 3 য় সারিটি প্রত্যাশার সাথে 3 এর একটি ROWID দেয়। তবে 2 টি সারি সন্নিবেশ করুন, শেষটি মুছুন এবং অন্যটি সন্নিবেশ করুন, তৃতীয় সন্নিবেশ করা সারিটি 2-এর একটি ROWID দেয়, যেমন দ্বিতীয় সারির মতো ছিল। সুতরাং একটি স্পষ্ট গুরুতর সমস্যা আছে যদি টেবিলগুলি এমন কোনও টেবিলের মধ্যে ROWIDs উল্লেখ করে যেখানে মুছে ফেলা হয় এবং যেখানে মুছে ফেলা বা ROWID নালিং সম্পর্কিত টেবিলগুলিতেও করা হয় না।
নিক

10
যদি উত্তর থেকে এটি সুস্পষ্ট না হয়, আপনি আপনার নির্বাচিত বিবৃতিতে ROWID ব্যবহার করতে পারেন যেমনselect rowid from people;
কলিন ডি

@ আপনার ধারণার পরিপূরক হিসাবে কেবল নিক: সুতরাং স্বতঃবৃদ্ধি একটি সুরক্ষা পরিমাপ। এবং আমরা ROWID এ দুটি সারি সংঘর্ষের কথা বলছি না।
ইউসুফাদির

68

হ্যাঁ, এটি সম্ভব। এসকিউএলাইট এফএকিউ অনুসারে :

ঘোষিত একটি কলাম INTEGER PRIMARY KEYস্বায়ত্তশাসন করবে।


12
উকু দ্বারা উল্লিখিত ক্যাভিয়েট, এবং ডকুমেন্টেশনেও ব্যাখ্যা করা হয়েছে, এটি কাজ করার জন্য আপনাকে আইডিটির জন্য একটি NUL পাস করতে হবে।
ম্যাট হুলসে

22
আপনি শুধুমাত্র প্রয়োজন কখনোই একটি ভাল অনুশীলন - আপনি আউট কলামের তালিকা ঢোকান ছেড়ে একটি শূন্য ব্যবহার করতে। আপনি যদি কলামগুলি নির্দিষ্ট করে থাকেন তবে আপনি স্বতঃবৃদ্ধি কলামটি কেবল ছেড়ে দিতে পারেন এবং এটি পরবর্তী মানটি পাবে।
ল্যারি লুস্টিগ

5
আর একটি সাবধানবাণী: উপরে বর্ণিত ঠিক মত "INTEGER ..." লিখুন। একটি শর্টহ্যান্ড "INT ..." কাজ করবে না।
মার্সিন ওয়াজনারস্কি

26

আজকের হিসাবে - জুন 2018


বিষয়টিতে অফিসিয়াল এসকিউএল ডকুমেন্টেশনের যা বলতে হবে তা এখানে রয়েছে (সাহসী এবং তাত্ত্বিক আমার)

  1. AUTOINCREMENT শব্দ চাপিয়ে অতিরিক্ত CPU- র, মেমরি, ডিস্ক স্পেস, এবং ডিস্কে ইনপুট / আউটপুট ওভারহেড এবং যদি কঠোরভাবে প্রয়োজন নেই এড়িয়ে চলা উচিত। এটি সাধারণত প্রয়োজন হয় না।

  2. SQLite, লিখুন সঙ্গে একটি কলাম পূর্ণসংখ্যা প্রাথমিক কী জন্য একটি alias হয় ROWID (ROWID টেবিল ছাড়া ছাড়া) যা সবসময় 64-বিট পূর্ণসংখ্যা সাইন করা হয়েছে।

  3. একটি INSERT- এ , যদি রাউইউআইডি বা স্বতন্ত্র প্রাথমিক কী কলামটি স্পষ্টভাবে কোনও মান দেওয়া না হয়, তবে এটি একটি অব্যবহৃত পূর্ণসংখ্যার সাথে স্বয়ংক্রিয়ভাবে পূরণ করা হবে , সাধারণত বর্তমানে ব্যবহৃত সবচেয়ে বড় ROWID এর চেয়ে আরও একটি বেশি স্বতঃশব্দ কীওয়ার্ড ব্যবহৃত হয় বা না তা নির্বিশেষে এটি সত্য।

  4. স্বতঃশব্দ কীওয়ার্ডটি যদি প্রাইমারী মূল কী এর পরে উপস্থিত হয় , যা ডাটাবেসের আজীবন ROWIDs এর পুনরায় ব্যবহার রোধ করতে স্বয়ংক্রিয় রাউইড অ্যাসাইনমেন্ট অ্যালগরিদম পরিবর্তন করে। অন্য কথায়, স্বতঃসিদ্ধ উদ্দেশ্য হ'ল পূর্বে মুছে ফেলা সারিগুলি থেকে ROWIDs এর পুনরায় ব্যবহার রোধ করা।


11

আপনি কি এটি পড়েছেন? আমি কীভাবে একটি স্বতঃসিদ্ধ ক্ষেত্র তৈরি করব।

INSERT INTO people
VALUES (NULL, "John", "Smith");

সুতরাং আপনি যা বলছেন তা হ'ল আমি যা করার চেষ্টা করছি তা সম্ভব নয় তবে আমি একরকম অনুকরণ করতে পারি। আমি sertোকাতে একটি নাল ব্যবহার করতে হবে?
ইওক

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

7
INSERT এ NUL কেবল তখনই প্রয়োজন হয় যদি আপনি INSERT- এ কলামগুলির তালিকা নির্দিষ্ট না করে থাকেন (এই ক্ষেত্রে আপনার কলামের সংখ্যার সাথে মিলে যাওয়ার মতো মানগুলির একটি সংখ্যা প্রয়োজন এবং অবশ্যই স্থানধারক হিসাবে NULL ব্যবহার করতে পারেন)। কিন্তু কলামগুলির তালিকা উল্লেখ না করে একটি INSERT করা কখনও ভাল অনুশীলন নয়। আপনি যদি কলামগুলির তালিকা নির্দিষ্ট করে থাকেন তবে কেবল স্বয়ত্তিকারের কলাম এবং NULL মান উভয়ই রেখে দিন এবং আপনি প্রত্যাশিত ফলাফল পাবেন।
ল্যারি লাস্টিগ

4

AUTOINCREMENTএকটির কাছে কীওয়ার্ড নির্দিষ্ট করা উচিত নয় PRIMARY KEY। স্বতঃসিদ্ধকরণ প্রাথমিক কী তৈরি এবং সন্নিবেশ করার উদাহরণ:

$ sqlite3 ex1

CREATE TABLE IF NOT EXISTS room(room_id INTEGER PRIMARY KEY, name VARCHAR(25) NOT NULL, home_id VARCHAR(25) NOT NULL);

INSERT INTO room(name, home_id) VALUES ('test', 'home id test');

INSERT INTO room(name, home_id) VALUES ('test 2', 'home id test 2');

SELECT * FROM room;

দিতে হবে:

1|test|home id test
2|test 2|home id test 2

4

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

AUTOINCREMENTশব্দ চাপিয়ে অতিরিক্ত CPU- র, মেমরি, ডিস্ক স্পেস, এবং ডিস্কে ইনপুট / আউটপুট ওভারহেড এবং যদি কঠোরভাবে প্রয়োজন নেই এড়িয়ে চলা উচিত। এটি সাধারণত প্রয়োজন হয় না।

বিস্তারিত তথ্যের জন্য এখানে পড়ুন ।


স্পষ্টতই রাউইডটি সর্বদা স্বয়ংক্রিয়ভাবে বৃদ্ধি পায় না, নিক মন্তব্যটি দেখুন
রোজারডপ্যাক

1
সত্য না. অটো বর্ধন কিছু ক্ষেত্রে ভাল, যেহেতু এটি আইডি পুনরায় ব্যবহার করবে না - অনেক সিস্টেমের জন্য এটি একটি অত্যন্ত গুরুত্বপূর্ণ প্রয়োজনীয়তা।
ও'রুনি

3

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

AUTOINCREM কীওয়ার্ডটি কেবলমাত্র INTEGER ফিল্ডের সাথে ব্যবহার করা যেতে পারে। বাক্য গঠন:

স্বতঃশব্দ কীওয়ার্ডের মূল ব্যবহারটি নিম্নরূপ:

CREATE TABLE table_name(
   column1 INTEGER AUTOINCREMENT,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

উদাহরণস্বরূপ নীচে দেখুন: নীচের মত সংস্থাগুলি তৈরির জন্য কোম্পানী বিবেচনা করুন:

sqlite> CREATE TABLE TB_COMPANY_INFO(
   ID INTEGER PRIMARY KEY   AUTOINCREMENT,
   NAME           TEXT      NOT NULL,
   AGE            INT       NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

এখন, TB_COMPANY_INFO টেবিলের মধ্যে নিম্নলিখিত রেকর্ডগুলি সন্নিবেশ করুন:

INSERT INTO TB_COMPANY_INFO (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'MANOJ KUMAR', 40, 'Meerut,UP,INDIA', 200000.00 );

এখন রেকর্ড নির্বাচন করুন

SELECT *FROM TB_COMPANY_INFO
ID      NAME            AGE     ADDRESS             SALARY
1       Manoj Kumar     40      Meerut,UP,INDIA     200000.00

2

আমি জানি এই উত্তরটি কিছুটা দেরিতে।
এই উত্তরের জন্য আমার উদ্দেশ্য হ'ল এসকিউএলাইটের সাথে এখন বা ভবিষ্যতে এই ধরণের চ্যালেঞ্জের মুখোমুখি হওয়া উচিত এবং তারা এর সাথে কঠোর সময় কাটাচ্ছেন।

এখন, আপনার জিজ্ঞাসার দিকে ফিরে তাকানো, এটি এমন কিছু হওয়া উচিত।

CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20));

এটা আমার শেষ কাজ করে। তাই ভালো,

এখানে চিত্র বর্ণনা লিখুন

আপনি যদি এসকিউএলাইটের সাথে কাজ করছেন তবে আমি আপনাকে এসকিউএলাইটের জন্য ডিবি ব্রাউজারটি পরীক্ষা করার পরামর্শ দিচ্ছি । পাশাপাশি বিভিন্ন প্ল্যাটফর্মে কাজ করে।


0

আপনি যা করেন তা সঠিক, তবে 'অটো ইনক্রিমেন্ট' এর সঠিক বাক্য গঠন স্থান ছাড়াই হওয়া উচিত:

CREATE TABLE people (id integer primary key autoincrement, first_name string, last_name string);

(দয়া করে নোট করুন যে আমি আপনার ভারচারগুলি স্ট্রিংয়ে পরিবর্তন করেছি That's এটি কারণ এসকিউএলাইট অভ্যন্তরীণভাবে একটি ভার্চারকে স্ট্রিংয়ে রূপান্তরিত করে, তাই কেন বিরক্ত হবে?)

তারপরে আপনার সন্নিবেশটি হওয়া উচিত, এসকিউএল ভাষায় যতটা সম্ভব মানক:

INSERT INTO people(id, first_name, last_name) VALUES (null, 'john', 'doe');

যদিও এটি সত্য যে আপনি আইডি বাদ দিলে এটি স্বয়ংক্রিয়ভাবে বৃদ্ধি এবং নির্ধারিত হবে, আমি ব্যক্তিগতভাবে ভবিষ্যতে পরিবর্তিত হতে পারে এমন স্বয়ংক্রিয় পদ্ধতিতে নির্ভর করতে পছন্দ করি না।

স্বতঃসংশোধনের উপর একটি নোট: যদিও অনেকের দ্বারা উল্লেখ করা হয়েছে, এটি এসকিউএলাইট লোকেরা দ্বারা সুপারিশ করা হয় না, যদি স্বতঃসংশোধন ব্যবহার না করা হয় তবে আমি মুছে ফেলা রেকর্ডগুলির আইডির স্বয়ংক্রিয় পুনঃব্যবহার পছন্দ করি না। অন্য কথায়, আমি পছন্দ করি যে মোছা রেকর্ডের আইডি আর কখনও দেখাবে না।

আছে HTH


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