MSSQL: Как найти все таблицы с внешними ключами, которые ссылаются на конкретный table.column И имеют значения для этих внешних ключей?
У меня есть таблица, первичный ключ которой упоминается в нескольких других таблицах как внешний ключ. Например:
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`)
)
Теперь я не знаю, сколько таблиц в базе данных содержит внешние ключи в X, например, таблицы Y и Z. Есть ли SQL-запрос, который я могу использовать для возврата: 1. Список таблиц с внешними ключами в X И 2. какие из этих таблиц действительно имеют значения во внешнем ключе
Спасибо!
Ответы
Ответ 1
попробуйте этот запрос:
Для получения информации
вы должны использовать таблицы sysreferences
и sysobjects
Ниже приведен список всех ключей foriegn, а также родительских таблиц с именами столбцов из базы данных
select cast(f.name as varchar(255)) as foreign_key_name
, cast(c.name as varchar(255)) as foreign_table
, cast(fc.name as varchar(255)) as foreign_column
, cast(p.name as varchar(255)) as parent_table
, cast(rc.name as varchar(255)) as parent_column
from sysobjects f
inner join sysobjects c on f.parent_obj = c.id
inner join sysreferences r on f.id = r.constid
inner join sysobjects p on r.rkeyid = p.id
inner join syscolumns rc on r.rkeyid = rc.id and r.rkey1 = rc.colid
inner join syscolumns fc on r.fkeyid = fc.id and r.fkey1 = fc.colid
where f.type = 'F'