বিদেশী কী রয়েছে এমন সমস্ত সারণী কীভাবে সন্ধান করবেন যেগুলি নির্দিষ্ট টেবিলের কলামগুলিকে উল্লেখ করে এবং সেই বিদেশী কীগুলির মান রয়েছে?


272

আমার একটি টেবিল রয়েছে যার প্রাথমিক কীটি বিদেশী কী হিসাবে অন্যান্য বেশ কয়েকটি টেবিলগুলিতে উল্লেখ করা হয়। উদাহরণ স্বরূপ:

  CREATE TABLE `X` (
    `X_id` int NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY  (`X_id`)
  )
  CREATE TABLE `Y` (
    `Y_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Y_id`),
    CONSTRAINT `Y_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )
  CREATE TABLE `Z` (
    `Z_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Z_id`),
    CONSTRAINT `Z_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )

এখন, আমি জানি না যে ডাটাবেসে কতগুলি টেবিল রয়েছে যাতে এক্সে বিদেশী কী রয়েছে টেবিল ওয়াই এবং জেড এর মতো।

  1. এক্সে বিদেশী কী রয়েছে এমন টেবিলগুলির একটি তালিকা
  2. এবং এই টেবিলগুলির মধ্যে কোনটির বিদেশী কীতে আসলে মান আছে

উত্তর:


384

আপনি এখানে যান:

USE information_schema;
SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id';

যদি আপনার একই ধরণের টেবিল / কলামের নাম সহ একাধিক ডাটাবেস থাকে তবে আপনি আপনার ক্যোয়ারিকে একটি নির্দিষ্ট ডাটাবেসে সীমাবদ্ধ রাখতে চাইতে পারেন:

SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id'
  AND TABLE_SCHEMA = 'your_database_name';

7
নির্বাচন করুন TABLE_NAME আরও ভাল তারপর নির্বাচন করুন
zloctb

কোন ধরণের ডিবি এর জন্য এটি দরকারী? মাইএসকিউএল?
Cirelli94

2
@ Cirelli94 প্রশ্নটি একটি মাইএসকিউএল প্রশ্ন হিসাবে ট্যাগ হয়েছে।
মাইকসুল্ড

61

মাইএসকিউএল 5.5 রেফারেন্স ম্যানুয়াল: "ইনোডিবি এবং বিদেশী মূল সীমাবদ্ধতা"

SELECT
  ke.REFERENCED_TABLE_SCHEMA parentSchema,
  ke.referenced_table_name parentTable,
  ke.REFERENCED_COLUMN_NAME parentColumnName,
  ke.TABLE_SCHEMA ChildSchema,
  ke.table_name childTable,
  ke.COLUMN_NAME ChildColumnName
FROM
  information_schema.KEY_COLUMN_USAGE ke
WHERE
  ke.referenced_table_name IS NOT NULL
  AND ke.REFERENCED_COLUMN_NAME = 'ci_id' ## Find Foreign Keys linked to this Primary Key
ORDER BY
  ke.referenced_table_name;

21

এই সমাধানটি কেবল সমস্ত সম্পর্ককেই প্রদর্শন করবে না তবে সীমাবদ্ধতার নামটিও দেখাবে যা কিছু ক্ষেত্রে প্রয়োজন (যেমন ড্রপ সীমাবদ্ধতা):

SELECT
    CONCAT(table_name, '.', column_name) AS 'foreign key',
    CONCAT(referenced_table_name, '.', referenced_column_name) AS 'references',
    constraint_name AS 'constraint name'
FROM
    information_schema.key_column_usage
WHERE
    referenced_table_name IS NOT NULL;

আপনি যদি একটি নির্দিষ্ট ডাটাবেসে টেবিলগুলি পরীক্ষা করতে চান তবে নিম্নলিখিতগুলি যুক্ত করুন:

AND table_schema = 'database_name';

15

বুদ্ধিমানের নামে আপনি স্কিমা সম্পর্কিত সমস্ত তথ্য খুঁজে পেতে পারেন information_schema টেবিলটিতে ।

আপনি টেবিলটি পরীক্ষা করতে চাইতে পারেন REFERENTIAL_CONSTRAINTSএবং KEY_COLUMN_USAGE। পূর্ববর্তী আপনাকে জানায় কোন টেবিলগুলি অন্যরা রেফারেন্স করে; পরবর্তীগুলি আপনাকে বলবে যে তাদের ক্ষেত্রগুলি কীভাবে সম্পর্কিত।


5

বিবরণ সহ একটি ডিবিতে সমস্ত বিদেশী কী তালিকাভুক্ত করা হচ্ছে

    SELECT  
    i1.CONSTRAINT_NAME, i1.TABLE_NAME,i1.COLUMN_NAME,
    i1.REFERENCED_TABLE_SCHEMA,i1.REFERENCED_TABLE_NAME, i1.REFERENCED_COLUMN_NAME,
    i2.UPDATE_RULE, i2.DELETE_RULE 
    FROM   
    information_schema.KEY_COLUMN_USAGE AS i1  
    INNER JOIN 
    information_schema.REFERENTIAL_CONSTRAINTS AS i2 
    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
    WHERE i1.REFERENCED_TABLE_NAME IS NOT NULL  
    AND  i1.TABLE_SCHEMA  ='db_name';

একটি সারণী সারণীতে একটি নির্দিষ্ট কলামে সীমাবদ্ধ

AND i1.table_name = 'target_tb_name' AND i1.column_name = 'target_col_name'

3

আমি একটু বাশ অনলাইনার লিখেছি যে আপনি একটি স্ক্রিপ্টে বন্ধুত্বপূর্ণ আউটপুট পেতে লিখতে পারেন:

mysql_references_to:

mysql -uUSER -pPASS -A DB_NAME -se "USE information_schema; SELECT * FROM KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = '$1' AND REFERENCED_COLUMN_NAME = 'id'\G" | sed 's/^[ \t]*//;s/[ \t]*$//' |egrep "\<TABLE_NAME|\<COLUMN_NAME" |sed 's/TABLE_NAME: /./g' |sed 's/COLUMN_NAME: //g' | paste -sd "," -| tr '.' '\n' |sed 's/,$//' |sed 's/,/./'

সুতরাং এক্সিকিউশন: mysql_references_to transaccion(যেখানে ট্রান্সএকসিওন একটি এলোমেলো টেবিলের নাম) এর ফলে একটি আউটপুট দেয়:

carrito_transaccion.transaccion_id
comanda_detalle.transaccion_id
comanda_detalle_devolucion.transaccion_positiva_id
comanda_detalle_devolucion.transaccion_negativa_id
comanda_transaccion.transaccion_id
cuenta_operacion.transaccion_id
...

-4

সবচেয়ে সহজ:
1. পিএইচপিএমআইএডমিন খুলুন
২. বাম ক্লিকের ডাটাবেসের নাম
3.. উপরের ডানদিকে কোণায় "ডিজাইনার" ট্যাবটি সন্ধান করুন

সমস্ত বাধা সেখানে প্রদর্শিত হবে।

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