كيف أعرف ما إذا كان Constrand_Name هو مفتاح أساسي أو أجنبي؟
-
23-08-2019 - |
سؤال
باستخدام 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
كل شيء في طاولات النظام والآراء التي تم توثيقها جيدا.