আমি কীভাবে কোনও টেবিল বা কলামে সমস্ত বিদেশী কী দেখতে পাব?


567

মাইএসকিউএলে, আমি কীভাবে একটি নির্দিষ্ট টেবিলের দিকে নির্দেশ করে সমস্ত বিদেশী কী বাধাগুলির একটি তালিকা পেতে পারি? একটি বিশেষ কলাম? এটি এই ওরাকল প্রশ্নের মতো একই জিনিস , তবে মাইএসকিউএল-এর জন্য।

উত্তর:


764

একটি টেবিলের জন্য:

SELECT 
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '<database>' AND
  REFERENCED_TABLE_NAME = '<table>';

একটি কলামের জন্য:

SELECT 
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '<database>' AND
  REFERENCED_TABLE_NAME = '<table>' AND
  REFERENCED_COLUMN_NAME = '<column>';

মূলত, আমরা যেখানে ক্লফটিতে REFERENCED_TABLE_NAME এর সাথে REFERENCED_COLUMN_NAME পরিবর্তন করেছি।


26
এটি সর্বদা আমাকে একটি খালি সেট দেয়, যখন নীচের নোড দ্বারা প্রস্তাবিত ক্যোয়ারী ভাল কাজ করে
তীব্র

7
@ অ্যাকিউট: আপনি কি নিশ্চিত যে আপনি সঠিক টেবিলটি সম্পর্কে জিজ্ঞাসা করছেন? নোডের ক্যোয়ারী যদি কাজ করে, তবে আপনি সম্ভবত অন্য দিকটি সম্পর্কে জিজ্ঞাসা করছেন (যেমন, মাইট্যাবল থেকে কীগুলি নয়, মাইট্যাবলের কীগুলি নয়)) এটি প্রত্যাশা করে আপনি টেবিলের নাম সহ '<table>' লিখেছেন এবং '<' এবং '>' ছাড়াই ?
ভিনকো ভার্সালোভিক

3
দেখে মনে হচ্ছে যে আমি আপনাকে জিজ্ঞাসা করেছিলাম তা ভুল বুঝেছি, কারণ আমি <table> :) থেকে রেফারেন্স কীগুলির জন্য জিজ্ঞাসা করছিলাম (হ্যাঁ, আমি "<table>" XD এর পরিবর্তে টেবিলের নাম লিখেছিলাম)
তীব্র

4
আপনার টেবিলের নামটি অনন্য বলে আপনি নিশ্চিত না হলে আপনি সম্ভবত নিজের ক্যোয়ারিকে একটি নির্দিষ্ট ডাটাবেসে সীমাবদ্ধ রাখতে চাইবেন। যেখানে where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
এইটির

এই ডেটাবেসের ব্যবহারকারীর সমস্ত অনুমতি থাকলেও এটি রুট নন ব্যবহারকারীদের ক্ষেত্রে কাজ করবে না
দীপক রাম

275

সম্পাদনা: মতামতগুলিতে যেমন উল্লেখ করা হয়েছে, এটি ওপিএস প্রশ্নের সঠিক উত্তর নয়, তবে এই আদেশটি জানার জন্য এটি দরকারী। আমি যা খুঁজছিলাম তার জন্য এই প্রশ্নটি গুগলে প্রদর্শিত হয়েছিল এবং অনুভূত হয়েছিল যে আমি এই উত্তরটি অন্যদের সন্ধানের জন্য রেখে দেব।

SHOW CREATE TABLE `<yourtable>`;

আমি এই উত্তরটি এখানে পেয়েছি: মাইএসকিউএল: টেবিল কমান্ডে সীমাবদ্ধতাগুলি দেখান

আমার এই পথটি প্রয়োজন ছিল কারণ আমি FK কীভাবে কাজ করে তা দেখতে চেয়েছিলাম এটির অস্তিত্ব আছে কি নেই তা দেখার চেয়ে।


37
এটি সমস্ত প্রতিবন্ধকতাগুলিকে দেখায় <yourtable>, সমস্ত প্রতিবন্ধকতাগুলিকে নির্দেশ করে না <yourtable>
বর্মার

18
@ বারমার যেমন বলেছেন, এটি সম্পূর্ণ ভুল; নির্দিষ্ট টেবিল একাত্মতার বিদেশী কীগুলি দেখাতে হবে, কিন্তু প্রতি নির্দেশ বিদেশী কী দেখাবে না করার টেবিল, যা কি প্রশ্ন জন্য অনুরোধ। এটি কীভাবে 50 টি আপগেট পেয়েছে তা ধারণা নেই; আমার ধারণা, লোকেরা এখানেই শেষ হয়েছিল যখন তারা সত্যিই বিপরীত প্রশ্নের উত্তর খুঁজছিল, তাদের উত্তর এখানেই পাওয়া গেছে এবং উত্সাহ দেওয়ার আগে মূল প্রশ্নটি (বা এমনকি এর শিরোনাম) পড়তে বিরক্ত করেনি।
মার্ক এ Amery

2
@ মার্কআমেরি: গুগলে এটি প্রথম ফলাফল, display foreign keys mysqlসে কারণেই এটি হতে পারে;)
জিগার

1
এটি প্রকৃতপক্ষে বিদ্যমান সমস্ত প্রতিবন্ধকতাগুলি দেখায়, phpmyadmin কেবল আপনাকে কেবল আপনার টেবিলের দিকে নির্দেশ করবে। একটি
ওআরএম

3
এটি আমি যা খুঁজছিলাম, তাই এটি পোস্ট করার জন্য ধন্যবাদ যদিও এটি ওপির প্রশ্নের উত্তর দেয়নি। কোনও সম্পর্কের দিক থেকে দু'দিকে কীভাবে তাকানো যায় তা জানতে কখনই ব্যাথা লাগে না!
চার্লস উড

75

আপনি যদি InnoDB এবং সংজ্ঞায়িত এফকে ব্যবহার করেন আপনি তথ্যের_স্কেমি ডাটাবেস যেমন:

SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' 
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';

15
আসলে, এটি ভুল দিক নির্দেশ করে। এই ক্যোয়ারিতে সমস্ত বিদেশী কীগুলি 'মাইটেবল' থেকে নির্দেশিত সমস্ত বিদেশী কী দেখায়, সমস্ত 'বিদেশী কী'কে' মাইটেবিল 'দেখায় না।
ক্রিশ্চিয়ান ওডার্ড

1
এটি আমার ক্ষেত্রে আরও ভাল কাজ করে। ইনোডিবি ইঞ্জিন মাইআইএসএএম বা এনডিবি পরিবর্তন করতে সক্ষম হওয়ার জন্য আমাকে একটি টেবিল থেকে প্রতি বিদেশী কী বাধা (এবং কেবলমাত্র) বাদ দিতে হবে।
কোহনি রবার্ট

আপনি উভয় দিকেই বিদেশী কীগুলি রেফারেন্সিয়াল_সিআরএনটিএলটিএস টেবিল থেকে পেতে পারেন - আমি ক্যোয়ারির সাথে আরও একটি উত্তর যুক্ত করেছি।
ChrisV

45

কিছু দরকারী তথ্য যুক্ত করতে একটি পুরাতন উত্তরের উপর পোস্ট করা।

আমারও একই সমস্যা ছিল, তবে আমি রেফারেন্সড টেবিল এবং কলামের নামগুলি সহ CONSTRAINT_TYPE দেখতে চাইছিলাম। সুতরাং,

  1. আপনার টেবিলের সমস্ত এফকে দেখতে:

    USE '<yourschema>';
    
    SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
    FROM information_schema.TABLE_CONSTRAINTS i 
    LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
    WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' 
    AND i.TABLE_SCHEMA = DATABASE()
    AND i.TABLE_NAME = '<yourtable>';
  2. আপনার স্কিমাতে সমস্ত টেবিল এবং এফকে দেখতে:

    USE '<yourschema>';
    
    SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
    FROM information_schema.TABLE_CONSTRAINTS i 
    LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
    WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' 
    AND i.TABLE_SCHEMA = DATABASE();
  3. আপনার ডাটাবেসে সমস্ত এফকে দেখতে:

    SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
    FROM information_schema.TABLE_CONSTRAINTS i 
    LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
    WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';

মনে রাখবেন!

এটি InnoDB স্টোরেজ ইঞ্জিন ব্যবহার করছে। এগুলি যুক্ত করার পরে যদি আপনি কোনও বিদেশী কীগুলি দেখানোর জন্য মনে করেন না এটি সম্ভবত আপনার টেবিলগুলি মাইআইএসএএম ব্যবহার করছে।

যাচাই করতে:

SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';

ঠিক করতে, এটি ব্যবহার করুন:

ALTER TABLE `<yourtable>` ENGINE=InnoDB;

8
এই প্রশ্নগুলি খুব দ্রুত চলে (2 সেকেন্ড থেকে 0.0015 সেকেন্ডের মধ্যে) আপনি যদি কে.ট্যাব্লাএলএসএইচএমএ = ডেটাবেস () এবং কে.ট্যাবলেট_NAME = '<t>>' এখানে উল্লেখ করেন
গিগুজ

2
দুর্দান্ত উত্তর মাইআইএসএএম এর জন্য আপনার কোনও সমাধান আছে?
বিউউউচার্ড

2
দুর্ভাগ্যক্রমে, মাইআইএসএএম বিদেশী কীগুলি সমর্থন করে না। dev.mysql.com/doc/refman/5.7/en/myisam-stores-engine.html
অ্যান্ডি

24

নোডের উত্তরের বিকল্প হিসাবে, আপনি যদি InnoDB এবং সংজ্ঞায়িত এফকে ব্যবহার করেন তবে আপনি তথ্য_স্কেমার ডাটাবেসটি জিজ্ঞাসা করতে পারেন যেমন:

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'

<টেবিল>, বা থেকে বিদেশী কীগুলির জন্য

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'

বিদেশী কীগুলির জন্য <টেবিল>

আপনি যদি চান তবে আপনি UPDATE_RULE এবং DELETE_RULEও পেতে পারেন।


2
REFERENTIAL_CONSTRAINTS টেবিলটি আপনাকে আপডেট এবং ক্যাসকেড বিধি দেয় বলে আমি ব্যক্তিগতভাবে এই উত্তরটিকে পছন্দ করি। +1
লুক মাধঙ্গ

একটি সারণী সম্পর্কে আবিষ্কার করা আপনার ভুলে যাওয়া উচিত নয় যে বিদেশী কীগুলি দুটি উপায়ে প্রতিষ্ঠিত হতে পারে!
এনকোডার

11

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

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;

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

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';

তেমনি একটি নির্দিষ্ট কলামের নামের জন্য যুক্ত করুন

এবং টেবিলের নাম = 'টেবিল_নাম

ক্যোয়ারির শেষে।

এখানে এই পোস্ট দ্বারা অনুপ্রাণিত


7

REFERENCED_TABLE_NAME ব্যবহার করা সর্বদা কার্যকর হয় না এবং এটি একটি নাল মান হতে পারে। নিম্নলিখিত কোয়েরি পরিবর্তে কাজ করতে পারে:

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';

4

আপনার এফকে (বিদেশী কী উল্লেখগুলি) তালিকাভুক্ত করার জন্য একটি দ্রুত উপায়

KEY_COLUMN_USAGE view:

SELECT CONCAT( table_name, '.',
column_name, ' -> ',
referenced_table_name, '.',
referenced_column_name ) AS list_of_fks
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;

এই ক্যোয়ারীটি ধরে নিয়েছে যে সীমাবদ্ধতা এবং সমস্ত রেফারেন্সিং এবং রেফারেন্সিং টেবিল একই স্কিমায় রয়েছে।

আপনার নিজের মন্তব্য যুক্ত করুন।

সূত্র: অফিসিয়াল মাইএসকিএল ম্যানুয়াল।


3

যে সমাধানটি আমি নিয়ে এসেছি তা ভঙ্গুর; এটি বিদেশী কীগুলির জন্য জাঙ্গোর নামকরণের সম্মেলনে নির্ভর করে।

USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee

তারপরে, খোলের মধ্যে,

grep 'refs_tablename_id' mysql_output

2

সব টেবিল খুঁজতে একটি নির্দিষ্ট বিদেশী কী সম্বলিত যেমনemployee_id

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';

2

আপনি যদি বিদেশী কী কলামের নাম পেতে চান:

SELECT i.TABLE_SCHEMA, i.TABLE_NAME, 
       i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, 
       k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
  FROM information_schema.TABLE_CONSTRAINTS i 
  LEFT JOIN information_schema.KEY_COLUMN_USAGE k 
       ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
 WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY' 
 ORDER BY i.TABLE_NAME;

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