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


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.