كيف يمكنني التحقق من وجود فهرس في حقل جدول في MySQL؟

StackOverflow https://stackoverflow.com/questions/127156

  •  02-07-2019
  •  | 
  •  

سؤال

لقد كنت بحاجة إلى البحث عن هذا الأمر في Google عدة مرات، لذا أشارككم الأسئلة والأجوبة.

هل كانت مفيدة؟

المحلول

يستخدم SHOW INDEX مثل ذلك:

SHOW INDEX FROM [tablename]

المستندات: https://dev.mysql.com/doc/refman/5.0/en/show-index.html

نصائح أخرى

يحاول:

SELECT * FROM information_schema.statistics 
  WHERE table_schema = [DATABASE NAME] 
    AND table_name = [TABLE NAME] AND column_name = [COLUMN NAME]

سيخبرك ما إذا كان هناك فهرس من أي نوع في عمود معين دون الحاجة إلى معرفة الاسم المعطى للفهرس.سيعمل أيضًا في إجراء مخزن (بدلاً من إظهار الفهرس)

SHOW KEYS FROM  tablename WHERE Key_name='unique key name'

يمكنك معرفة ما إذا كان هناك مفتاح فريد في الجدول

show index from table_name where Column_name='column_name';

استخدم العبارة التالية:عرض الفهرس من الجدول الخاص بك

ثم تحقق من النتيجة للحقول:الصف ["الجدول"]، الصف ["Key_name"]

تأكد من كتابة "Key_name" بشكل صحيح

لمجرد إلقاء نظرة على تخطيط الجداول من CLI.كنت ستفعل

desc mytable

أو

عرض الجدول mytable

إذا كنت بحاجة إلى الوظيفة في حالة وجود فهرس لعمود (هنا في المركز الأول بالتسلسل) كوظيفة قاعدة بيانات، فيمكنك استخدام/اعتماد هذا الرمز.إذا كنت تريد التحقق من وجود فهرس على الإطلاق بغض النظر عن موضعه في فهرس متعدد الأعمدة، فما عليك سوى حذف الجزء "AND SEQ_IN_INDEX = 1".

DELIMITER $$
CREATE FUNCTION `fct_check_if_index_for_column_exists_at_first_place`(
    `IN_SCHEMA` VARCHAR(255),
    `IN_TABLE` VARCHAR(255),
    `IN_COLUMN` VARCHAR(255)
)
RETURNS tinyint(4)
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Check if index exists at first place in sequence for a given column in a given table in a given schema. Returns -1 if schema does not exist. Returns -2 if table does not exist. Returns -3 if column does not exist. If index exists in first place it returns 1, otherwise 0.'
BEGIN

-- Check if index exists at first place in sequence for a given column in a given table in a given schema. 
-- Returns -1 if schema does not exist. 
-- Returns -2 if table does not exist. 
-- Returns -3 if column does not exist. 
-- If the index exists in first place it returns 1, otherwise 0.
-- Example call: SELECT fct_check_if_index_for_column_exists_at_first_place('schema_name', 'table_name', 'index_name');

-- check if schema exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.SCHEMATA
WHERE 
    SCHEMA_NAME = IN_SCHEMA
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -1;
END IF;


-- check if table exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.TABLES
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -2;
END IF;


-- check if column exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
AND COLUMN_NAME = IN_COLUMN
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -3;
END IF;

-- check if index exists at first place in sequence
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    information_schema.statistics 
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE AND COLUMN_NAME = IN_COLUMN
AND SEQ_IN_INDEX = 1;


IF @COUNT_EXISTS > 0 THEN
    RETURN 1;
ELSE
    RETURN 0;
END IF;


END$$
DELIMITER ;

يمكنك استخدام عبارة SQL التالية للتحقق من فهرسة العمود المحدد في الجدول أم لا

select  a.table_schema, a.table_name, a.column_name, index_name
from    information_schema.columns a
join    information_schema.tables  b on a.table_schema  = b.table_schema and
                                    a.table_name = b.table_name and 
                                    b.table_type = 'BASE TABLE'
left join (
 select     concat(x.name, '/', y.name) full_path_schema, y.name index_name
 FROM   information_schema.INNODB_SYS_TABLES  as x
 JOIN   information_schema.INNODB_SYS_INDEXES as y on x.TABLE_ID = y.TABLE_ID
 WHERE  x.name = 'your_schema'
 and    y.name = 'your_column') d on concat(a.table_schema, '/', a.table_name, '/', a.column_name) = d.full_path_schema
where   a.table_schema = 'your_schema'
and     a.column_name  = 'your_column'
order by a.table_schema, a.table_name;

نظرًا لأن الصلات تتعارض مع INNODB_SYS_*، لذا فإن فهارس المطابقة تأتي فقط من جداول INNODB فقط

لا يمكنك تشغيل استعلام عرض فهرس محدد لأنه سيؤدي إلى حدوث خطأ في حالة عدم وجود فهرس.لذلك، يجب عليك جمع كافة الفهارس في مصفوفة والتكرار من خلالها إذا كنت تريد تجنب أي أخطاء SQL.

هنا كيف أفعل ذلك.أحصل على جميع الفهارس من الجدول (في هذه الحالة، leads) وبعد ذلك، في حلقة foreach، تحقق مما إذا كان اسم العمود (في هذه الحالة، province) موجود أم لا.

$this->name = 'province';

$stm = $this->db->prepare('show index from `leads`');
$stm->execute();
$res = $stm->fetchAll();
$index_exists = false;

foreach ($res as $r) {
    if ($r['Column_name'] == $this->name) {
        $index_exists = true;
    }
}

بهذه الطريقة يمكنك تضييق نطاق سمات الفهرس.افعل أ print_r ل $res لكي ترى ما يمكنك العمل به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top