মাইএসকিউএল সন্নিবেশ করুন কোয়েরি


121

এই প্রশ্নের সাথে কী দোষ হয়েছে:

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

এটি WHEREধারা ছাড়াই কাজ করে । আমি আমার এসকিউএল ভুলে গেছে বলে মনে হচ্ছে ..

উত্তর:


237

মাইএসকিউএল INSERT সিনট্যাক্স যেখানে যেখানে ক্লোজ সমর্থন করে না তাই এটি আপনার দাঁড় করায় ব্যর্থ হবে। ধরে নিচ্ছি আপনারid কলামটি অনন্য বা প্রাথমিক কী:

আপনি যদি আইডি 1 দিয়ে একটি নতুন সারি সন্নিবেশ করানোর চেষ্টা করছেন তবে আপনার ব্যবহার করা উচিত:

INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);

আপনি যদি আইডি 1 সহ বিদ্যমান সারিটির জন্য ওজন / কাঙ্ক্ষিত ওজন মানগুলি পরিবর্তন করার চেষ্টা করছেন তবে আপনার ব্যবহার করা উচিত:

UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;

আপনি যদি চান তবে আপনি INSERT ব্যবহার করতে পারেন .. কী কী সিনট্যাক্সটি ডুপ্লিকেট করুন:

INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

বা এমনকি এটি পছন্দ:

INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

এটি উল্লেখ করাও গুরুত্বপূর্ণ যে যদি আপনার idকলামটি একটি স্বয়ংসোধক কলাম হয় তবে আপনি নিজের INSERT থেকে এটি একসাথে বাদ দিতে পারেন এবং মাইএসকিএলকে স্বাভাবিক হিসাবে বাড়িয়ে দিতে পারেন।


1
একটি ভাল উত্তরের জন্য ধন্যবাদ। আপডেটের সময় ব্যবহার করার সময় এটির কাজটি ঠিক আছে। তবে, যখন আইডি প্রাথমিক কী এবং অটো ইনক্রিমেন্ট কী হয় তখন উপরের ইনসার্ট স্টেটমেন্টটি কাজ করে না key কী এর জন্য ডাবলিকেট এন্ট্রি '1'
জেডিগুইড

1
@ জেড ডেভেলপার এটি কারণ সারিটি ইতিমধ্যে বিদ্যমান। চাদ যেমন If you're trying to insert a new row with ID 1 you should be usingINSERT INTO উল্লেখ করেছেন । আপনার ক্ষেত্রে আপনি যখন আইডি 1 ইতিমধ্যে উপস্থিত রয়েছে তখন এটি সন্নিবেশ করার চেষ্টা করছেন এবং এটি একটি প্রাথমিক বা অনন্য কী এবং ব্যর্থ হয় যাতে আপনার না হয়
আপডেটের

41

আপনি একটি ভ্যালু ক্লজের সাথে একটি WHERE ধারাটি একত্রিত করতে পারবেন না। আমি যতটা সচেতন তত আপনার কাছে দুটি বিকল্প রয়েছে-

  1. মান উল্লেখ করে লিখুন

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. একটি নির্বাচন বিবৃতি ব্যবহার করুন

    INSERT INTO Users(weight, desiredWeight) 
    SELECT weight, desiredWeight 
    FROM AnotherTable 
    WHERE id = 1

19

আপনি আপডেটের প্রশ্নের জন্য WHERE ধারাটি ব্যবহার করেন। আপনি যখন সন্নিবেশ করবেন, আপনি ধরে নিচ্ছেন যে সারিটি বিদ্যমান নেই।

ওপির বক্তব্যটি তখন পরিণত হত;

আপডেট আপডেট ব্যবহারকারীরা ওজন = 160, কাঙ্ক্ষিত ওজন = 45 যেখানে আইডি = 1;

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

সম্পাদনা

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

মাইএসকিউএল এর প্রতিস্থাপন কাজ করে না। এটি একটি মোছা করে (যা সারিটির অস্তিত্ব না থাকলে কোনও বিকল্প হতে পারে), তার পরে একটি INSERT আসে। পরিণতি সম্পর্কে চিন্তা করুন। ট্রিগার এবং বিদেশী কী নির্ভরতা। পরিবর্তে, INSERT ব্যবহার করুন ... কী কী আপডেটের জন্য ডুপ্লিকেট করুন।


7
মাইএসকিউএল এর প্রতিস্থাপন কাজ করে না। এটি একটি মোছা করে (যা সারিটির অস্তিত্ব না থাকলে কোনও বিকল্প হতে পারে), তার পরে একটি INSERT আসে। পরিণতি সম্পর্কে চিন্তা করুন। ট্রিগার এবং বিদেশী কী নির্ভরতা। পরিবর্তে, INSERT ব্যবহার করুন ... কী কী আপডেটের জন্য ডুপ্লিকেট করুন।
বিল কারভিন 21'09


5

সারণি সন্ধান করুন কীওয়ার্ড * সমর্থন করে না

শর্তাবলী প্রযোজ্য কারণ আপনি যেখানে সাব-সিলেক্ট স্টেটমেন্টের শর্ত ব্যবহার করতে পারেন। আপনি সাব-সিলেক্ট ব্যবহার করে জটিল সন্নিবেশ সম্পাদন করতে পারেন।

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

INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';

সন্নিবেশ বিবৃতিতে একটি "নির্বাচন করুন" রেখে আপনি বহুগুণ সন্নিবেশগুলি দ্রুত সম্পাদন করতে পারেন।

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

SELECT count(*)
FROM customers
WHERE city = 'Newark';

আপনি বিদ্যমান শর্তটি ব্যবহার করে নকল তথ্য সন্নিবেশ করিয়েছেন তা নিশ্চিত করতে পারেন।

উদাহরণস্বরূপ, যদি আপনার ক্লায়েন্ট_আইডির প্রাথমিক কী সহ ক্লায়েন্টদের নামের একটি টেবিল থাকে তবে আপনি নীচের বিবৃতিটি ব্যবহার করতে পারেন:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

এই বিবৃতিটি একটি উপ-নির্বাচন সহ একাধিক রেকর্ড সন্নিবেশ করিয়েছে।

আপনি যদি একটি একক রেকর্ড সন্নিবেশ করতে চান তবে আপনি নীচের বিবৃতিটি ব্যবহার করতে পারেন:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

দ্বৈত সারণির ব্যবহার আপনাকে মানগুলি একটি নির্বাচিত বিবৃতিতে প্রবেশ করতে দেয়, যদিও মানগুলি বর্তমানে কোনও টেবিলে সঞ্চিত থাকে না।

কীভাবে ক্লজ সহ সন্নিবেশ করা যায় তা দেখুন


4

এই প্রশ্নের সঠিক উত্তরটি এরকম হবে:

ক)। যদি sertোকানোর আগে নির্বাচন করতে চান:

INSERT INTO Users( weight, desiredWeight ) 
  select val1 , val2  from tableXShoulatNotBeUsers
  WHERE somecondition;

খ)। IF রেকর্ড ইতিমধ্যে বিদ্যমান প্রবেশের পরিবর্তে আপডেট আপডেট ব্যবহার করে:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

হতে হবে

Update Users set weight=160, desiredWeight=145  WHERE id = 1;

গ)। আপনি একই সাথে আপডেট বা সন্নিবেশ করতে চাইলে

Replace Users set weight=160, desiredWeight=145  WHERE id = 1;

Note):- you should provide values to all fields else missed field in query 
        will be set to null

ঘ)। যদি আপনি একই টেবিল থেকে একটি রেকর্ড ক্লোন করতে চান তবে কেবল মনে রাখবেন যে আপনি যে টেবিলটি সন্নিবেশ করছেন তা আপনি নির্বাচন করতে পারবেন না

 create temporary table xtable ( weight int(11), desiredWeight int(11) ;

 insert into xtable (weight, desiredWeight) 
    select weight, desiredWeight from Users where [condition]

 insert into Users (weight, desiredWeight) 
    select weight , desiredWeight from xtable;

আমি মনে করি এটি বেশিরভাগ পরিস্থিতিতে জুড়েছে


3

ইনসার্ট স্টেটমেন্ট করার সময় আপনি কেবল কোথায় ব্যবহার করতে পারবেন না:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

হতে হবে:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );

WHERE অংশটি কেবল নির্বাচনী বিবৃতিগুলিতে কাজ করে:

SELECT from Users WHERE id = 1;

বা আপডেটের বিবৃতিতে:

UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;

2

Tableোকান = একটি সারণিতে সারি যুক্ত করা

আপেট = নির্দিষ্ট সারি আপডেট করুন।

যেখানে আপনার সন্নিবেশে ধারাটি বর্ণনা করবে? এর সাথে মিলের মতো কিছু নেই, সারিটি বিদ্যমান নেই (এখনও) ...


2

আপনি ব্যবহারকারী ইনপুট উপর ভিত্তি করে শর্তসাপেক্ষ INSERT করতে পারেন। এই ইনপুরিটি কেবল তখনই প্রবেশ করিয়ে দিবে যদি ইনপুট ভার্স '$ ইউজারওয়েট' এবং '$ ব্যবহারকারীর ডিজাইনার ওয়েইট' ফাঁকা না থাকে

INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1

এটি পরিস্থিতিটির উপর নির্ভর করে INSERT এর আসলে যেখানে একটি ধারা থাকতে পারে।

উদাহরণস্বরূপ, যদি আপনি কোনও ফর্মের সাথে মানগুলি মেলে।

Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com

বোধ হয় তাই না?


এটি কি সম্ভব যেখানে সন্নিবেশ বিবৃতিতে ধারাটি রয়েছে
তাজ_100

1

সবচেয়ে সহজ উপায় হ'ল আপনার মূল সীমাবদ্ধতা লঙ্ঘন করতে IF ব্যবহার করা। এটি কেবল ইনসার্ট ইগনোরের জন্য কাজ করে তবে আপনাকে কোনও INSERT এ সীমাবদ্ধতা ব্যবহার করতে দেয়।

INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');

1

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

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


1

আপনি যদি ডেটা forোকানোর জন্য কোনও নির্দিষ্ট রেকর্ড নির্দিষ্ট করে থাকেন তবে UPDATEবিবৃতিটির পরিবর্তে বিবৃতি ব্যবহার করা আরও ভাল INSERT

প্রশ্নটিতে আপনি লিখেছেন এই ধরণের কোয়েরিটি একটি ডামি ক্যোয়ারির মতো।

আপনার প্রশ্নটি হ'ল: -

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

এখানে, আপনি আইডি = 1 নির্দিষ্ট করে দিচ্ছেন, সুতরাং UPDATEবিদ্যমান রেকর্ডটি আপডেট করার জন্য আপনি স্টেটমেন্ট ব্যবহার করুন t WHEREএ ক্ষেত্রে ক্ষেত্রে ধারাটি ব্যবহার করার পরামর্শ দেওয়া হয় না You আপনার ব্যবহার করা INSERTউচিত UPDATE

এখন আপডেট ক্যোয়ারী ব্যবহার করে: -

UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;

কোনও সাথী ১ ম কোয়েরি কাজ করবে না। প্রথম জিজ্ঞাসাটি করা প্রশ্ন।
জেডিগুইড

আপনি সন্নিবেশের উপরে আপডেটের পরামর্শ দিচ্ছেন কেন? ব্যবহারকারী শর্ত সহ মান সন্নিবেশ করতে চায় এবং প্রস্থানিত রেকর্ডগুলি আপডেট করতে চায় না।
সোমনাথ মুলুক

1

WHERE-ধারাটি আসলে যে কোনও ক্ষেত্রে INSERT-INTO-VALUES এর সাথে ব্যবহার করা যেতে পারে?

উত্তর অবশ্যই না।

INSERT INTO এর পরে একটি বিভাজন যুক্ত করা হচ্ছে ... ভ্যালুয়াস ... কেবলমাত্র অবৈধ এসকিউএল, এবং বিশ্লেষণ করবে না।

মাইএসকিউএল দ্বারা ফিরে আসা ত্রুটিটি হ'ল:

mysql> INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 1' at line 1

ত্রুটি বার্তার সবচেয়ে গুরুত্বপূর্ণ অংশটি হ'ল

... syntax to use near 'WHERE id = 1' ...

যা পার্সার এখানে সুনির্দিষ্ট অংশটি খুঁজে পাবে বলে প্রত্যাশা করেছিল তা দেখায়: WHERE ধারা।


1

এটি সম্পূর্ণ ভুল। INSERT QUERY এর যেখানে কোনও ক্লজ নেই, কেবলমাত্র আপডেটের QUERY এ রয়েছে। আপনি যদি আইডি = 1 ডেটা যুক্ত করতে চান তবে আপনার ক্যোয়ারী হবে

UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;

1

না। আমি যতদূর জানি আপনি এই ক্যোয়ারিতে WHERE ধারাটি যুক্ত করতে পারবেন না। হতে পারে আমি আমার এসকিউএলকেও ভুলে গেছি, কারণ কেন আপনার যেভাবে প্রয়োজন হয় কেন আমি সত্যিই নিশ্চিত নই।


1

Conditionোকানো বিবৃতিতে শর্তটি আপনার ব্যবহার করা উচিত নয়। আপনি যদি করতে চান তবে একটি আপডেট বিবৃতিতে sertোকান এবং তারপরে একটি বিদ্যমান রেকর্ড আপডেট করুন।

আসলে আমি কি জানতে পারি যে সন্নিবেশ বিবৃতিতে আপনার যেখানে ক্লজ দরকার কেন ??

হতে পারে কারণের ভিত্তিতে আমি আপনাকে আরও একটি ভাল বিকল্প প্রস্তাব করতে পারি।


1

আমি মনে করি আপনার সেরা বিকল্পটি INSERT এর পরিবর্তে REPLACE ব্যবহার করুন

ব্যবহারকারীদের মধ্যে প্রতিস্থাপন (আইডি, ওজন, পছন্দসই ওজন) ভ্যালু (1, 160, 145);


1

এই হিসাবে ভাল পড়ুন

এটি অর্থে ... এমনকি আক্ষরিক নয়

INSERTমানে একটি যুক্ত করুন new rowএবং আপনি যখন বলছেন যে WHEREআপনি কোন সারিটির বিষয়ে কথা বলছেন তা নির্ধারণ করুন SQL

সুতরাং বিদ্যমান সারিতে থাকা শর্তের সাথে একটি নতুন সারি যুক্ত করা সম্ভব নয়।

আপনাকে নিম্নলিখিত থেকে চয়ন করতে হবে:

উ: এর UPDATEপরিবর্তে ব্যবহার করুনINSERT

বি। ধারাটি ব্যবহার করুন INSERTএবং অপসারণ করুন WHERE(আমি কেবল এটি বলছি ...) অথবা আপনি যদি সত্যই ব্যবহার করতে বাধ্য হন INSERTএবং WHEREএকক বিবৃতিতে এটি কেবল ইনসার্টের মাধ্যমে করা যেতে পারে ... অনুচ্ছেদে ধারা ...

INSERT INTO Users( weight, desiredWeight ) 
SELECT FROM Users WHERE id = 1;

তবে এটি সম্পূর্ণ ভিন্ন উদ্দেশ্যে পরিবেশন করে এবং যদি আপনি প্রাথমিক কী হিসাবে আইডি সংজ্ঞায়িত করেন তবে এই সন্নিবেশটি ব্যর্থ হবে, অন্যথায় আইডি = 1 দিয়ে একটি নতুন সারি .োকানো হবে।


হ্যাঁ আপনার সঠিক, জেনে রাখা এই সমস্ত জিনিস ভুল করে তোলে make
আলেশা জর্জ

1

আমি সচেতন যে এটি একটি পুরাতন পোস্ট তবে আমি আশা করি এটি এখনও কাউকে সাহায্য করবে, আমি যা আশা করি তার একটি সহজ উদাহরণ:

পটভূমি:

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

INSERT into MyTable(aUser,aCar)
value(User123,Mini)

এই কনস্ট্রাক্টটি ব্যবহার করে আপনি প্রকৃতপক্ষে একটি নির্দিষ্ট ব্যবহারকারীকে লক্ষ্য করুন (ব্যবহারকারী 123, যার অন্যান্য রেকর্ড রয়েছে) যাতে আপনার সত্যিকারের কোনও দফা প্রয়োজন হয় না, আমি গণনা করি।

আউটপুট হতে পারে:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

1

INSERT এবং WHERE ব্যবহার করার একটি উপায়

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); এক্ষেত্রে অস্তিত্ব পরীক্ষার মতো নয়। আপনি যদি এটি দুটি বা ততোধিক বার চালনা করেন তবে কোনও ব্যতিক্রম নেই ...


0

পোস্ট পদ্ধতি ব্যবহার করে বিবৃতিতে মাইএসকিএল forোকানোর জন্য সঠিক বাক্য গঠন:

$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";

1
কোনও আক্রমণকারীকে স্বেচ্ছাসেবী এসকিউএল কমান্ডগুলি ইনজেকশন থেকে আটকাতে আপনাকে অবিশ্বস্ত প্যারামিটারগুলি যেমন ইউজারনেম বা প্যারামিটারাইজড কোয়েরিগুলি ব্যবহার করতে হবে । এবং পাসওয়ার্ড সঞ্চয় করতে একটি হ্যাশক্রিপ্ট অ্যালগরিদম ব্যবহার করুন।
হেনড্রিক ব্রুমারম্যান

0

আমি মনে করি না যে আমরা যেখানে বিবৃতি সন্নিবেশ করলাম সেখানে ব্যবহার করতে পারি


0
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';

1
এটি কী করে এবং এটি ওপিকে কীভাবে সম্বোধন করে তার প্রসারিত করার জন্য আপনি কি আপনার প্রস্তাবিত উত্তরটি সম্পাদনা করতে পারেন?
রো ইয়ো মি

0

আপনি INSERT এবং WHERE একসাথে ব্যবহার করতে পারবেন না। আপনি নীচের কোডের মতো নির্দিষ্ট ক্ষেত্রে নির্দিষ্ট কলামের মান যুক্ত করার জন্য আপডেট আপডেটটি ব্যবহার করতে পারেন;

UPDATE Users
SET weight='160',desiredWeight ='145'  
WHERE id =1

0

আমি মনে করি যে নির্দিষ্ট সারিটিতে একটি মান সন্নিবেশ করতে সঠিক ফর্মটি হ'ল:

UPDATE table SET column = value WHERE columnid = 1

এটি কাজ করে, এবং আপনি মাইক্রোসফ্ট এসকিউএল সার্ভারে লিখলে অনুরূপ

INSERT INTO table(column) VALUES (130) WHERE id = 1;

mysql এ আপনাকে টেবিলটি আপডেট করতে হবে।


0

আপনি নীচের কোড সহ এটি করতে পারেন:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.