Wie kann ich wissen, ob CONSTRAINT_NAME ein Primär- oder Fremdschlüssel ist?
-
23-08-2019 - |
Frage
Mit dieser SQL auf SQL Server 2005
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
Ich bekomme die Primärschlüssel und die Fremdschlüssel.
Wie kann ich nur Fremdschlüssel? Wie kann ich sehen, ob ein Constraint ist ein primärer oder ein Fremdschlüssel?
Danke
Lösung 2
Ich habe die folgende SQL mit SQL Server 2005 den Constraint-Namen von Primärschlüssel zu erhalten:
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)
Um den Constraint-Namen von Foreing Key zu erhalten:
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName
Um den Fremdschlüssels der Tabelle und Feld durch Constraint-Namen zu erhalten:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME = @ConstraintName
Um den Primärschlüssels der Tabelle und Feld durch Constraint-Namen zu erhalten:
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)
Andere Tipps
Gefunden eine viel elegantere Lösung hier
-Code hinzugefügt unten auf Vollständigkeit, sondern alle Kredit geht an Pinal Dave
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
Und wenn Sie nur die Primärschlüssel wollen ...
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
Als weitere Antwort hinzugefügt, weil es aus meinem vorherigen entfernt, so weit ist:)
Es hängt von Ihrem DBMS aber eine Einschränkung soll die Zieltabelle und Spalte irgendwo hat.
Wenn es ein Fremdschlüssel ist, wird die Zieltabelle der aktuellen Tabelle unterschiedlich sein. Versuchen
select *
statt
select constraint_name
alle magischen Spalten zu sehen, Sie arbeiten kann.
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
AND REFERENCED_COLUMN_NAME IS NOT NULL
Es ist nicht die eleganteste Lösung, aber MS SQL Server verwendet die PK & FK Präfix Konvention für Schlüssel zu benennen, so dass Sie so etwas wie ...
verwenden könntenSELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND LEFT(CONSTRAINT_NAME,2) = 'FK'
Wenn das DBMS:)
Bearbeiten
Wenn ich die Antwort von Quassnoi versuchte ich bekam eine „Ungültiger Spaltenname‚REFERENCED_COLUMN_NAME‘.“ Fehler.
Ich benutze so etwas. Es funktioniert in SQL Server 2000 als auch.
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
Es ist alles in Systemtabellen und Ansichten, die recht gut dokumentiert sind.