একই কলাম মানগুলির সাথে মাইএসকিএল টেবিল থেকে একটি নির্দিষ্ট সারিটি কীভাবে মুছবেন?


153

মাইএসকিউএলে আমার প্রশ্নাগুলি নিয়ে আমার সমস্যা আছে have আমার টেবিলটিতে 4 টি কলাম রয়েছে এবং এটি দেখতে এরকম কিছু দেখাচ্ছে:

id_users    id_product    quantity    date
 1              2              1       2013
 1              2              1       2013
 2              2              1       2013
 1              3              1       2013

id_usersএবং id_productবিভিন্ন টেবিলের বিদেশী কীগুলি।

আমি যা চাই তা হ'ল কেবল একটি সারি মুছে ফেলা:

1     2     1    2013

যা দু'বার প্রদর্শিত হবে, তাই আমি এটি মুছতে চাই।

আমি এই জিজ্ঞাসা চেষ্টা করেছি:

delete from orders where id_users = 1 and id_product = 2

তবে এটি উভয়কে মুছে ফেলবে (যেহেতু তারা সদৃশ)। এই সমস্যাটি সমাধান করার কোনও ইঙ্গিত?

উত্তর:


208

একটি যোগ করুন limitথেকে ডিলিট ক্যোয়ারী

delete from orders 
where id_users = 1 and id_product = 2
limit 1

3
এটি কেবল একটি সারি মুছে দেয়। এই ব্যবহারকারী এবং পণ্য আইডি সহ যদি 3 জন থাকে তবে 2 টি রয়ে যাবে।
রব

10
হ্যাঁ, ওপি বলছেন (গুলি) তিনি 1 টি সারি মুছতে চান। আমার কোয়েরিটি এটাই করে।
২৮

2
হ্যাঁ, তবে আমি মনে করি এটি সে চায় না।
রব

3
ধন্যবাদ জুয়ারজেন এটাই আমার দরকার!
দানি

3
ওপিকে যা করতে হবে তা হ'ল প্রথমে কোন সারিগুলি নকল হয় তা পরীক্ষা করে তারপরে সদৃশগুলি মুছুন।
wbinky

64

সমস্ত টেবিলের একটি প্রাথমিক কী থাকা উচিত (একক বা একাধিক কলাম সমন্বিত), নকল সারিগুলি একটি সম্পর্কিত ডেটাবেসে বোঝায় না। আপনি মুছে ফেলা সারিগুলির সংখ্যা সীমাবদ্ধ করতে পারেন LIMITযদিও:

DELETE FROM orders WHERE id_users = 1 AND id_product = 2 LIMIT 1

তবে এটি কেবল আপনার বর্তমান সমস্যা সমাধান করে, প্রাথমিক কীগুলি সংজ্ঞায়িত করে আপনার অবশ্যই বড় ইস্যুতে কাজ করা উচিত।


1
এটি উল্লেখ করা ভাল যে প্রাথমিক কীটি একটি সম্পর্কিত ডেটাবেসে অনন্য হওয়া উচিত।
পল

1
@ পল এটি আমি বলতে যাচ্ছি ঠিক তাই। তবে ভুলে যাবেন না অনন্য কীটির প্রয়োজন নেই প্রাথমিক কী necessary
রায়ান ফাং

20

আপনাকে মুছে ফেলা উচিত এমন সারিগুলির সংখ্যা নির্দিষ্ট করতে হবে। আপনার ক্ষেত্রে (এবং আমি ধরে নিই যে আপনি কেবল একটি রাখতে চান) এটি এইভাবে করা যেতে পারে:

DELETE FROM your_table WHERE id_users=1 AND id_product=2
LIMIT (SELECT COUNT(*)-1 FROM your_table WHERE id_users=1 AND id_product=2)

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

এটি 5.5.40 এ আমার জন্য কাজ করছে না, এটি একটি সিনট্যাক্স ত্রুটি ছুঁড়েছে। হিসাবে এখানে উল্লেখ করেছে: stackoverflow.com/a/578926/1076075 , মনে হচ্ছে আমরা একটা সীমা দফা মান সেটি নির্ধারণের জন্য একটি subquery ব্যবহার করতে পারবেন না। : কাপড় এই ভাবে করার চেষ্টা যে কেউ জন্য, এই খুঁজে বার করো stackoverflow.com/q/578867/1076075
ভরদ্বাজ Srigiriraju

8

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


1
বা স্থায়ী সারি। আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমার যদিও এটি করা উচিত। আইডি এর এই ধরণের পরিস্থিতির জন্য ব্যবহৃত হয়। আপনি যদি স্থানটি নিয়ে চিন্তিত হন: একটি বিগিন্ট মাত্র 8 বাইট!
ইসমাইল মিগুয়েল

5

এর মধ্যে সারি মোছার জন্য ইতিমধ্যে উত্তর রয়েছে LIMIT। আদর্শভাবে আপনার টেবিলে প্রাথমিক কী থাকা উচিত। তবে যদি না হয়।

আমি অন্য উপায় দেব:

  1. অনন্য সূচক তৈরি করে

আমি দেখছি আইডি_উসার এবং আইডি_প্রডাক্ট আপনার উদাহরণে অনন্য হওয়া উচিত।

ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)

এটি একই ডেটা সহ নকল সারি মুছে ফেলবে।

তবে আপনি যদি এখনও ত্রুটি পান তবে আইজিএনওর ধারাটি ব্যবহার করেও, চেষ্টা করে দেখুন:

ALTER TABLE orders ENGINE MyISAM;
ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)
ALTER TABLE orders ENGINE InnoDB; 
  1. আবার টেবিল তৈরি করে

যদি সেখানে একাধিক সারি থাকে যার সদৃশ মান থাকে তবে আপনি টেবিলটি পুনরায় তৈরি করতে পারেন

RENAME TABLE `orders` TO `orders2`;

CREATE TABLE `orders` 
SELECT * FROM `orders2` GROUP BY id_users, id_product;

1

আপনাকে অবশ্যই একটি আইডি যুক্ত করতে হবে যা প্রতিটি সারিটির জন্য স্ব-বৃদ্ধি হয়, তারপরে আপনি তার আইডি দিয়ে সারিটি ডিলেট করতে পারেন। সুতরাং আপনার টেবিলটিতে প্রতিটি সারিটির জন্য একটি অনন্য আইডি থাকবে এবং id_user, id_product ইসি ...

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