1 দ্বারা একটি ডাটাবেস ক্ষেত্র বৃদ্ধি করুন


158

মাইএসকিউএল সহ, আমার যদি একটি ক্ষেত্র থাকে, লগইন বলার জন্য, আমি কীভাবে একটি বর্গ কমান্ডের মধ্যে সেই ক্ষেত্রটি 1 দ্বারা আপডেট করতে যাব?

আমি একটি INSERT ক্যোয়ারী তৈরি করার চেষ্টা করছি, যা ফার্স্টনাম, লাস্টনেম এবং লগইন তৈরি করে। তবে যদি ফার্স্টনেম এবং লাস্টনামের সংমিশ্রণটি ইতিমধ্যে বিদ্যমান থাকে তবে লগইনগুলিকে 1 দ্বারা বাড়ান।

সুতরাং টেবিলটি দেখতে এমন হতে পারে ..

firstName----|----lastName----|----logins

John               Jones             1
Steve              Smith             3

আমি একটি কমান্ডের পরে রয়েছি যে যখন রান করা হয় তখন হয় কোনও নতুন ব্যক্তি (অর্থাত্ টম রজারস) প্রবেশ করানো হবে বা যদি জন জোন্স নামটি ব্যবহার করা হয় তবে ইনক্রিমেন্ট লগিন প্রবেশ করানো হবে ..

উত্তর:


287

একটি এন্ট্রি আপডেট করা হচ্ছে:

একটি সাধারণ বর্ধনের কৌশলটি করা উচিত।

UPDATE mytable 
  SET logins = logins + 1 
  WHERE id = 12

নতুন সারি sertোকান, বা ইতিমধ্যে উপস্থিত থাকলে আপডেট করুন:

আপনি যদি পূর্বের বিদ্যমান সারিটি আপডেট করতে চান বা এটি ইতিমধ্যে বিদ্যমান না থাকে তবে এটি সন্নিবেশ করতে পারেন, আপনি REPLACEবাক্য গঠন বা INSERT...ON DUPLICATE KEY UPDATEবিকল্পটি ব্যবহার করতে পারেন (যেমন রব ভ্যান ড্যাম তার উত্তরে প্রদর্শিত হয়েছিল )।

একটি নতুন এন্ট্রি প্রবেশ করানো হচ্ছে:

অথবা সম্ভবত আপনি কিছু খুঁজছেন INSERT...MAX(logins)+1? মূলত আপনি নীচের মতো অনেকগুলি ক্যোয়ারী চালাবেন - আপনার নির্দিষ্ট প্রয়োজনের উপর নির্ভর করে সম্ভবত কিছুটা জটিল:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable

3
এছাড়াও, আপনার আবেদনের যথাযথ হিসাবে আপনার WHERE ধারাটি যুক্ত করতে ভুলবেন না।
বোল্টক্লক

ওহ সত্যিই!! আমি জানতাম না যে আপনি এটা করতে পারবেন !!! তাহলে এই কাজ করবে? অন্তর্ভুক্ত ইগনোর মাইটিবেল (প্রথম নাম, শেষ নাম, লগইন) ভ্যালুস (জন, স্মিথ, লগইনস = লগইন + 1)
ম্যাট

@ ম্যাট না, এটি একটি INSERT, একটি নয় UPDATE। আপনি যদি একটি সন্নিবেশ করতে চান তবে আপনাকে সর্বোচ্চটি পেতে এবং এটিতে 1 যুক্ত করতে হবে।
সাম্পসন

2
@ ম্যাট আপনার প্রশ্নটি " এটি 1 দ্বারা আপডেট করার বিষয়ে" জিজ্ঞাসা করেছিল যা বিভ্রান্তির কারণ হয়েছিল। আমি মনে করি আপনি অন্য একটি সমাধান খুঁজছেন, যা আমি আমার আপডেট হওয়া উত্তরে উল্লেখ করেছি d
সাম্পসন

1
@ জোনাথন বিভ্রান্তির জন্য দুঃখিত .. আমি আমার প্রশ্ন আপডেট করেছি, আশা করি কিছুটা পরিষ্কার হয়ে গেলো ..
ম্যাট

70

আপনি যদি নিরাপদে (প্রথম নাম, সর্বশেষ নাম) প্রাথমিক কী তৈরি করতে পারেন বা কমপক্ষে একটি অনন্য কী রাখতে পারেন তবে আপনি এটি করতে পারেন:

INSERT INTO logins (firstName, lastName, logins) VALUES ('Steve', 'Smith', 1)
ON DUPLICATE KEY UPDATE logins = logins + 1;

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


1
64+ বাইট প্রাথমিক কীটি দুর্দান্ত পরামর্শ নয়
জন ব্ল্যাক

'1' এর জায়গায় কোনও পরিবর্তনশীল কাজ ব্যবহার করবেন? অর্থাত্ মূল কী আপডেট আপডেট লগইন = লগইন + numLogins; (অবশ্যই সঠিকভাবে ফর্ম্যাট করা হয়েছে)
ম্যাট

1
ON DUPLICATE KEY UPDATEসম্পূর্ণ প্রতিলিপি নিরাপদ নয় যে সাবধান !
আউসিল

2

আপনি যা করতে চাইছেন তা আপনি বলেননি, তবে আপনি অন্য উত্তরের মন্তব্যে এটি যথেষ্টভাবে ইঙ্গিত করেছিলেন। আমি মনে করি আপনি সম্ভবত একটি অটো ইনক্রিমেন্ট কলাম খুঁজছেন

create table logins (userid int auto_increment primary key, 
  username varchar(30), password varchar(30));

তাহলে sertোকাতে কোনও বিশেষ কোডের প্রয়োজন নেই। মাত্র

insert into logins (username, password) values ('user','pass');

আপনি ক্লায়েন্ট কোডে এই বিবৃতিটি কার্যকর করার সময় কোন ইউজারিড তৈরি হয়েছিল তা জানাতে মাইএসকিউএল এপিআইয়ের ফাংশন রয়েছে।


2

আমি মাইএসকিউএল এ বিশেষজ্ঞ নই তবে আপনার সম্ভবত ট্রিগারগুলির দিকে নজর দেওয়া উচিত যেমন সন্নিবেশের আগে। ট্রিগারটিতে আপনি আপনার মূল টেবিলের উপরের নির্বাচন জিজ্ঞাসা চালাতে পারেন এবং যদি এটির কিছু পাওয়া যায় তবে নতুন মান সন্নিবেশ না করে সারি 'লগইনস' আপডেট করুন। তবে এই সমস্তগুলি আপনি চালিত মাইএসকিউএলের সংস্করণটির উপর নির্ভর করে।


2

এই আরো উত্তর যার উপরে ব্যবহারের সুপারিশ একটি নম্বরে একটি পাদটীকা হয় ON DUPLICATE KEY UPDATE, সাবধান থাকুন যে এই হল না সবসময় রেপ্লিকেশন নিরাপদ, তাই যদি আপনি কি কখনও একটি একক সার্ভার পরলোক ক্রমবর্ধমান পরিকল্পনা, আপনি এই এড়াতে এবং দুই প্রশ্নের ব্যবহার করতে চাইবেন এক অস্তিত্ব যাচাই করতে, এবং তারপর একটি দ্বিতীয় পারেন UPDATE একটি সারিতে বিদ্যমান যখন, অথবা INSERTযখন এটি না।

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