سؤال

باستخدام SQL هذا SQL Server 2005

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName
  AND COLUMN_NAME=@ColumnName

أحصل على المفاتيح الأساسية والمفاتيح الأجنبية.

كيف يمكنني الحصول على مفاتيح أجنبية فقط؟ كيف يمكنني معرفة ما إذا كان القيود هو مفتاح أساسي أو أجنبي؟

شكرا

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

المحلول 2

استخدمت SQL التالية مع SQL Server 2005 للحصول على أسماء القيد حسب المفتاح الأساسي:

SELECT Constraint_Name 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
WHERE UNIQUE_CONSTRAINT_NAME = 
   (SELECT CONSTRAINT_NAME 
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
    WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)

للحصول على اسم القيد عن طريق مفتاح العمل

SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName

للحصول على جدول ومجال المفتاح الأجنبي حسب اسم القيد:

SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME = @ConstraintName

للحصول على جدول وحقل المفتاح الأساسي حسب اسم قيد:

SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME = 
    (SELECT UNIQUE_CONSTRAINT_NAME 
     FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
     WHERE CONSTRAINT_NAME = @ConstraintName)

نصائح أخرى

وجدت حلا أكثر أناقة هنا

تمت إضافة الرمز أدناه للكمال ولكن كل الائتمان يذهب إلى بوادال ديف

SELECT f.name AS ForeignKey,
   OBJECT_NAME(f.parent_object_id) AS TableName,
   COL_NAME(fc.parent_object_id, 
   fc.parent_column_id) AS ColumnName,
   OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
   COL_NAME(fc.referenced_object_id, 
   fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
LEFT JOIN sys.foreign_key_columns AS fc
   ON f.OBJECT_ID = fc.constraint_object_id

وإذا كنت تريد فقط المفاتيح الأساسية ...

SELECT i.name AS IndexName,
        OBJECT_NAME(ic.OBJECT_ID) AS TableName,
        COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
FROM sys.indexes AS i
        INNER JOIN sys.index_columns AS ic
        ON i.OBJECT_ID = ic.OBJECT_ID 
    AND i.index_id = ic.index_id
WHERE i.is_primary_key = 1

وأضاف هذا كإجابة إضافية لأنها إزالتها حتى الآن من بلدي السابق :)

يعتمد ذلك على DBMS الخاص بك ولكن يجب أن يكون للقيد أن يكون لديه جدول الهدف والعمود في مكان ما.

إذا كان هناك قيود مفتاح أجنبي، فسيكون الجدول المستهدف مختلفا عن الجدول الحالي. يحاول

select *

بدلا من

select constraint_name

لرؤية جميع الأعمدة السحرية التي يمكنك العمل بها.

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
  AND COLUMN_NAME=@ColumnName
  AND REFERENCED_COLUMN_NAME IS NOT NULL

ليس أكثر الحلول أناقة ولكن MS SQL Server يستخدم اتفاقية تسمية بادئة PK & FK للحصول على مفاتيح حتى تتمكن من استخدام شيء مثل ...

SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName
AND LEFT(CONSTRAINT_NAME,2) = 'FK'

إذا كان هذا هو DBMS الخاص بك :)

تعديل

عندما جربت الإجابة بواسطة Quassnoi، حصلت على "اسم عمود غير صالح" مرجعي_column_name ". خطأ.

أنا استخدم شيئا من هذا القبيل. يعمل في SQL Server 2000 أيضا.

select  object_name(fkx.constid) as fk_name,
        fkx.keyno as num,
        object_name(fkx.fkeyid) as child_table,
        col_name(fkx.fkeyid, fkx.fkey) as child_column,
        object_name(fkx.rkeyid) as parent_table,
        col_name(fkx.rkeyid, fkx.rkey) as parent_column
from sysforeignkeys fkx
order by fk_name, fkx.keyno

كل شيء في طاولات النظام والآراء التي تم توثيقها جيدا.

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