সদৃশ কীতে কিছুই করবেন না


14

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

CREATE TABLE `requests` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `ctg` VARCHAR(15) NOT NULL,
    `msg` VARCHAR(250) NOT NULL,
    `nick` VARCHAR(32) NOT NULL,
    `filled` ENUM('Y','N') NOT NULL DEFAULT 'N',
    `dated` DATETIME NOT NULL,
    `filldate` DATETIME NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `nick_msg` (`nick`, `msg`),
    UNIQUE INDEX `ctg_msg` (`ctg`, `msg`)
)
COMMENT='Requests from users in any of the categories.'
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

এখন, আমার সমস্যাটি হ'ল, যখন কোনও ব্যবহারকারী (প্রতিনিধিত্ব করে nick) আবার একই অনুরোধটি সন্নিবেশ করানোর চেষ্টা করে, UNIQUEসূচকটি পরীক্ষা করা হয় এবং স্ক্রিপ্টটি একটি মিথ্যা প্রত্যাবর্তন করে। এর ফলে আমার স্ক্রিপ্ট ব্যর্থ হয় এবং আমাকে স্ক্রিপ্টটি পুনরায় চালু করতে হয়।

INSERT ... ON DUPLICATE KEYকমান্ডটিতে আমি এমন কিছু করতে পারি যাতে এটি কিছু না করে বা কমপক্ষে ক্ষেত্রে কোনও ত্রুটি না ফেরায় DUPLICATE KEY?

অন্যথায় আমাকে datedনতুন ক্ষেত্রটি সহ আমার ক্ষেত্রটি আপডেট করতে হবে DATETIME

উত্তর:


23

তিনটি উপায়। হয় IGNOREনকল ত্রুটি:

INSERT IGNORE 
  ... ;                   -- without ON DUPLICATE KEY

বা যখন কোনও সদৃশ থাকে তখন অতিরিক্ত কাজ করার চেষ্টা করুন:

INSERT 
  ... 
ON DUPLICATE KEY UPDATE
  id = id ;

বা সন্নিবেশ করার আগে সদৃশগুলি পরীক্ষা করুন:

INSERT INTO requests
  (id, ctg, msg, nick, filled, dated, filldate)
SELECT
  NULL, 'urgent', 'Help!', 'Hermione', 'Y', NOW(), NOW()
FROM
  dual
WHERE NOT EXISTS
      ( SELECT *  FROM requests  WHERE (nick, msg) = ('Hermione', 'Help!') )
  AND NOT EXISTS
      ( SELECT *  FROM requests  WHERE (ctg, msg) = ('urgent', 'Help!') ) ;

তৃতীয় উপায় এবং প্রথম দুটি মধ্যে পার্থক্য হ'ল ডুপ্লিকেটগুলি থাকাকালীন, idবৃদ্ধি করা হবে না। সাথে INSERT IGNOREএবংINSERT ... ON DUPLICATE KEY এটি স্বয়ংক্রিয় বর্ধিত হবে এবং যেহেতু সন্নিবেশটি করা হবে না, আপনার মানগুলির মধ্যে ফাঁক থাকবে id

আমার এটিও যুক্ত করা উচিত যে আপনার স্ক্রিপ্টগুলিতে সর্বদা ত্রুটিগুলি পরীক্ষা করা উচিত এবং যখন কোনও রয়েছে তখন ব্যর্থ হয় না। যে কোনও প্রশ্নের বা বিবৃতি বিভিন্ন কারণে ব্যর্থ হতে পারে এবং মাঝে মাঝে ত্রুটি ফিরে আসতে পারে। উপরের কৌশলগুলি আপনাকে এক ধরণের ত্রুটি থেকে রক্ষা করবে।


1

বিকল্পগুলি দুর্দান্ত, আমি কেবল একটি চতুর্থটি জানি। আপনি নিম্নলিখিত হিসাবে একটি পদ্ধতি তৈরি করতে পারেন (মাইএসকিউএল 5.5 বা উচ্চতর)।

DELIMITER ;;
CREATE PRODECURE...
...necessary parameters...
BEGIN

DECLARE v_dups BIGINT;
DECLARE CONTINUE HANDLER FOR 1062 SET v_dups = v_dups + 1;

-- RUN SIMPLE INSERT, IF IT TAKES DUPLICATE KEY NOTHING HAPPENS
END;;

ভাল লাগল, আমি ইদানীং মাইএসকিউএল ব্যবহার করিনি তাই আমি এটি জানতাম না। আপনি কী আপডেট এবং এটিকে আরও বিশদভাবে বলতে পারেন: অন্যান্য (ডুপ্লিকেট কী কী লঙ্ঘন না করে) ত্রুটি ঘটলে কী ঘটে? এবং এই কাজটি ঠিক কীভাবে (1062 এর জন্য কী দাঁড়ায়) কাজ করে? কোয়েরিতে কি একটি সেজ inোকানো দরকার বা এটি একাধিক সারি সন্নিবেশ করানোর কাজ করতে পারে?
ypercubeᵀᴹ

1062 সদৃশ সারি। কেবলমাত্র এই এসকিউএল ত্রুটিটি ট্রিগার করে: এসইটি v_dups = v_dups + 1;
বিলমাস্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.