মাইএসকিউএল: উপস্থিত না থাকলে সূচক তৈরি করুন


62

মাইএসকিউএল উপস্থিত না থাকলে কোনও সূচক তৈরি করার কোনও উপায় আছে কি?

মাইএসকিউএল সুস্পষ্ট ফর্ম্যাটটিকে সমর্থন করে না:

CREATE INDEX IF NOT EXISTS index_name ON table(column)
ERROR 1064 (42000): You have an error in your SQL syntax;...

মাইএসকিউএল সংস্করণ ( mysql -V) 5.1.48, তবে আমি মনে করি যে মাইএসকিউএল CREATE INDEX IF NOT EXISTএর সমস্ত সংস্করণে সামর্থ্যের অভাব রয়েছে ।

মাইএসকিউএলে ইতিমধ্যে বিদ্যমান না থাকলে সূচক তৈরির সঠিক উপায় কী?

উত্তর:


36

যে কার্যকারিতা বিদ্যমান নেই। দুটি বিষয় মাথায় রাখতে হবে:

যাইহোক সূচি তৈরি করুন

আপনি সূচকটি এমনভাবে তৈরি করতে পারেন যে পরীক্ষা না করে সূচকটি তৈরি করা হয় সূচি সময়ের আগে উপস্থিত থাকে। উদাহরণস্বরূপ, আপনি নিম্নলিখিত চালাতে পারেন:

ALTER TABLE table_name ADD INDEX (column_to_index);
ALTER TABLE table_name ADD INDEX (column_to_index);

এটি অবশ্যই চেক না করে দুটি সূচক তৈরি করবে। প্রতিটি সূচকে একটি নাম বরাদ্দ করা হবে (সম্ভবত কলাম_ টু_আইডেক্স, কলাম_ টু_আইনডেক্স_1)। অবশ্যই, আপনি এটি এড়ানোর চেষ্টা করছেন।

প্রথমে INFORMATION_SCHEMA দেখুন

এখানে INFORMATION_SCHEMA.STATISTICS এর লেআউটটি রয়েছে:

mysql> show create table statistics\G
*************************** 1. row ***************************
       Table: STATISTICS
Create Table: CREATE TEMPORARY TABLE `STATISTICS` (
  `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
  `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
  `NON_UNIQUE` bigint(1) NOT NULL DEFAULT '0',
  `INDEX_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  `INDEX_NAME` varchar(64) NOT NULL DEFAULT '',
  `SEQ_IN_INDEX` bigint(2) NOT NULL DEFAULT '0',
  `COLUMN_NAME` varchar(64) NOT NULL DEFAULT '',
  `COLLATION` varchar(1) DEFAULT NULL,
  `CARDINALITY` bigint(21) DEFAULT NULL,
  `SUB_PART` bigint(3) DEFAULT NULL,
  `PACKED` varchar(10) DEFAULT NULL,
  `NULLABLE` varchar(3) NOT NULL DEFAULT '',
  `INDEX_TYPE` varchar(16) NOT NULL DEFAULT '',
  `COMMENT` varchar(16) DEFAULT NULL,
  `INDEX_COMMENT` varchar(1024) NOT NULL DEFAULT ''
) ENGINE=MEMORY DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql>

আপনি কেবল নাম অনুসারে সূচকের অস্তিত্বের জন্য অনুসন্ধান করতে পারেন। উদাহরণস্বরূপ, আপনি চালানোর আগে

CREATE INDEX index_name ON mytable(column);

আপনার চালানো দরকার

SELECT COUNT(1) IndexIsThere FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_schema=DATABASE() AND table_name='mytable' AND index_name='index_name';

যদি সূচকগুলি 0 হয় তবে আপনি সূচিতে তৈরি করতে পারেন। আপনার পছন্দের টেবিলে একটি সূচক তৈরি করতে সম্ভবত আপনি একটি সঞ্চিত পদ্ধতি লিখতে পারেন।

DELIMITER $$

DROP PROCEDURE IF EXISTS `adam_matan`.`CreateIndex` $$
CREATE PROCEDURE `adam_matan`.`CreateIndex`
(
    given_database VARCHAR(64),
    given_table    VARCHAR(64),
    given_index    VARCHAR(64),
    given_columns  VARCHAR(64)
)
BEGIN

    DECLARE IndexIsThere INTEGER;

    SELECT COUNT(1) INTO IndexIsThere
    FROM INFORMATION_SCHEMA.STATISTICS
    WHERE table_schema = given_database
    AND   table_name   = given_table
    AND   index_name   = given_index;

    IF IndexIsThere = 0 THEN
        SET @sqlstmt = CONCAT('CREATE INDEX ',given_index,' ON ',
        given_database,'.',given_table,' (',given_columns,')');
        PREPARE st FROM @sqlstmt;
        EXECUTE st;
        DEALLOCATE PREPARE st;
    ELSE
        SELECT CONCAT('Index ',given_index,' already exists on Table ',
        given_database,'.',given_table) CreateindexErrorMessage;   
    END IF;

END $$

DELIMITER ;

এখানে একটি নমুনা চালানো হয়েছে (আরে এই টেবিলটি মনে রাখবেন? এটি আপনি 27 শে জুন, 2012-এ পুনরায় জিজ্ঞাসা করেছেন এমন প্রশ্ন থেকে ):

mysql> show create table pixels\G
*************************** 1. row ***************************
       Table: pixels
Create Table: CREATE TABLE `pixels` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(30) DEFAULT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `pixel_data` blob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> call createindex('adam_matan','pixels','type_timestamp_id_ndx','type,timestamp,id');
Query OK, 0 rows affected (0.20 sec)

mysql> show create table pixels\G
*************************** 1. row ***************************
       Table: pixels
Create Table: CREATE TABLE `pixels` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(30) DEFAULT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `pixel_data` blob,
  PRIMARY KEY (`id`),
  KEY `type_timestamp_id_ndx` (`type`,`timestamp`,`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> call createindex('adam_matan','pixels','type_timestamp_id_ndx','type,timestamp,id');
+-----------------------------------------------------------------------+
| CreateindexErrorMessage                                               |
+-----------------------------------------------------------------------+
| Index type_timestamp_id_ndx Already Exists on Table adam_matan.pixels |
+-----------------------------------------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

mysql>

একবার চেষ্টা করে দেখো !!!


37

SELECT IF()আপনি যদি প্রক্রিয়া না করার চেষ্টা করেন তবে মাইএসকিউএলে বিবৃতি ব্যবহারের সাথে আমারও তেমন কিছু রয়েছে :

select if (
    exists(
        select distinct index_name from information_schema.statistics 
        where table_schema = 'schema_db_name' 
        and table_name = 'tab_name' and index_name like 'index_1'
    )
    ,'select ''index index_1 exists'' _______;'
    ,'create index index_1 on tab_name(column_name_names)') into @a;
PREPARE stmt1 FROM @a;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

এখানে select ifএই বিন্যাস আছে if (condition, true_case, false_case)select 'index index_1 exists'একটি ডামি ক্ষেত্রে দেখা যায়। এবং _____ওরফে নামের ভূমিকা পালন করে। যদি উপনামটি করা না হয় তবে কলামের নাম এবং সারি উভয় শো দেখায় index index_1 existsযা আরও বেশি বিভ্রান্ত করে। আরও বর্ণনামূলক আপনি ব্যবহার করতে পারেন 'select ''index index_1 exists'' as _______;'


3

আপনি যদি সূচকের নাম রাখেন তবে সূচকটি ইতিমধ্যে উপস্থিত থাকলে (মাইএসকিউএল 8.0 এ পরীক্ষিত) ক্যোয়ারী ব্যর্থ হবে:

ALTER TABLE `my_table` ADD INDEX `col_idx` (`col` DESC);

ত্রুটি কোড: 1061. সদৃশ কী নাম 'col_idx';

সুতরাং আপনি কেবল ব্যতিক্রমটি ধরতে পারেন এবং এটিকে উপেক্ষা করতে পারেন, উদাহরণস্বরূপ পিএইচপিতে:

try {
    $db->query('ALTER TABLE `my_table` ADD INDEX `col_idx` (`col` DESC) VISIBLE;');
} catch (PDOException $ex) {
    if($exception->errorInfo[2] == 1061) {
        // Index already exists
    } else {
        // Another error occurred
    }
}

2
SELECT COUNT(*)
FROM information_schema.statistics
WHERE TABLE_SCHEMA = DATABASE()
  AND TABLE_NAME = 'table_name' 
  AND INDEX_NAME = 'index_name'; 

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

মাইএসকিউএল 5.5 সংস্করণে পরীক্ষিত

মারিয়াডিবি IF NOT EXISTSসিনট্যাক্স সমর্থন করে । আপনি CREATE INDEX IF NOT EXISTSসেখানে ব্যবহার করতে পারেন ।

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