查一个表的所有外键

select
a.name as 约束名,
object_name(b.parent_object_id) as 外键表,
d.name as 外键列,
object_name(b.referenced_object_id) as 主健表,
c.name as 主键列
from sys.foreign_keys A
inner join sys.foreign_key_columns B on A.object_id=b.constraint_object_id
inner join sys.columns C on B.parent_object_id=C.object_id and B.parent_column_id=C.column_id 
inner join sys.columns D on B.referenced_object_id=d.object_id and B.referenced_column_id=D.column_id 
where object_name(B.referenced_object_id)='表名';
<think>我们正在查询当前数据库中某个的所有信息。根据之前的引用和标准方法,最可靠的方式是查询information_schema数据库中的KEY_COLUMN_USAGE或REFERENTIAL_CONSTRAINTS。 根据引用[3]和引用[5],我们可以使用类似以下语句: SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name'; 但是,这个语句只能得到约束的基本信息,没有具体的列信息。 更完整的做法是结合KEY_COLUMN_USAGE和REFERENTIAL_CONSTRAINTS。 根据引用[1]和引用[4]中的方法,我们也可以使用生成删除的语句来反向获取信息,但这里我们只需要查询。 因此,推荐使用如下查询: 步骤: 1. 确定当前数据库名(如果不知道,可以使用`SELECT DATABASE();`获取当前数据库) 2. 指定要查询名(假设为your_table) 我们可以这样写: ```sql SELECT kcu.CONSTRAINT_NAME AS '约束名', kcu.COLUMN_NAME AS '列名', kcu.REFERENCED_TABLE_NAME AS '关联', kcu.REFERENCED_COLUMN_NAME AS '关联列', rc.DELETE_RULE AS '删除规则', rc.UPDATE_RULE AS '更新规则' FROM information_schema.KEY_COLUMN_USAGE AS kcu JOIN information_schema.REFERENTIAL_CONSTRAINTS AS rc ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA WHERE kcu.TABLE_SCHEMA = 'your_database' -- 替换为你的数据库名 AND kcu.TABLE_NAME = 'your_table' -- 替换为你的名 AND kcu.REFERENCED_TABLE_NAME IS NOT NULL; -- 确保是 ``` 注意:如果当前被其他引用,那么上述查询不会显示(因为上述查询的是当前作为子)。如果要查询当前被哪些引用,则应该将条件改为在REFERENCED_TABLE_NAME上匹配当前。 但是用户的问题是“当前的所有”,通常指的是当前作为子所拥有的(即当前引用了哪些)。 另,根据引用[2]中关于约束的示例,会阻止违反参照完整性的操作。 如果用户想要同时看当前引用的和引用当前,则需要两个查询。 不过,根据问题描述,用户只要求查询当前的所有(即当前引用的)。因此,我们提供上述查询即可。 如果用户没有指定数据库名,我们可以使用变量代替,但需要提醒用户替换。 另,我们也可以使用当前数据库,通过变量传入: 例如,在MySQL命令行中,可以先选择数据库: USE your_database; 然后使用以下查询(使用当前数据库): ```sql SELECT kcu.CONSTRAINT_NAME AS '约束名', kcu.COLUMN_NAME AS '列名', kcu.REFERENCED_TABLE_NAME AS '关联', kcu.REFERENCED_COLUMN_NAME AS '关联列', rc.DELETE_RULE AS '删除规则', rc.UPDATE_RULE AS '更新规则' FROM information_schema.KEY_COLUMN_USAGE AS kcu JOIN information_schema.REFERENTIAL_CONSTRAINTS AS rc ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA WHERE kcu.TABLE_SCHEMA = DATABASE() -- 使用当前数据库 AND kcu.TABLE_NAME = 'your_table' -- 替换为你的名 AND kcu.REFERENCED_TABLE_NAME IS NOT NULL; ``` 注意:在MySQL中,DATABASE()函数返回当前数据库名称。 如果用户需要查询引用当前(即其他引用了当前),则可以使用: ```sql SELECT kcu.TABLE_NAME AS '引用', kcu.COLUMN_NAME AS '引用列', kcu.CONSTRAINT_NAME AS '约束名', kcu.REFERENCED_TABLE_NAME AS '被引用', kcu.REFERENCED_COLUMN_NAME AS '被引用列', rc.DELETE_RULE AS '删除规则', rc.UPDATE_RULE AS '更新规则' FROM information_schema.KEY_COLUMN_USAGE AS kcu JOIN information_schema.REFERENTIAL_CONSTRAINTS AS rc ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA WHERE kcu.REFERENCED_TABLE_SCHEMA = 'your_database' -- 替换为你的数据库名 AND kcu.REFERENCED_TABLE_NAME = 'your_table'; -- 替换为你的名 ``` 但根据问题,用户只需要当前(即当前引用的),所以我们提供第一种。 因此,我们给出第一种查询的详细说明。 另,根据引用[1],我们也可以使用禁用的方法,但这里不适用,因为只是查询。 总结回答: 要查询MySQL中当前的所有信息(即当前作为子引用的),可以使用以下SQL语句(请将'your_database'和'your_table'替换为实际的数据库名和名):</think>### 通过SQL查询MySQL的所有信息 要查询MySQL数据库中指定的所有信息,可以使用以下两种推荐方法: #### 方法1:查询当前约束(推荐) ```sql SELECT kcu.CONSTRAINT_NAME AS '约束名', kcu.COLUMN_NAME AS '列', kcu.REFERENCED_TABLE_NAME AS '关联', kcu.REFERENCED_COLUMN_NAME AS '关联列', rc.DELETE_RULE AS '删除规则', rc.UPDATE_RULE AS '更新规则' FROM information_schema.KEY_COLUMN_USAGE kcu JOIN information_schema.REFERENTIAL_CONSTRAINTS rc ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA WHERE kcu.TABLE_SCHEMA = 'your_database' -- 替换为数据库名 AND kcu.TABLE_NAME = 'your_table' -- 替换为名 AND kcu.REFERENCED_TABLE_NAME IS NOT NULL; ``` **参数说明**: - `your_database`: 当前数据库名称 - `your_table`: 要查询名称 **输出示例**: | 约束名 | 列 | 关联 | 关联列 | 删除规则 | 更新规则 | |--------------|--------|----------|--------|------------|------------| | fk_order_user| user_id| users | id | CASCADE | RESTRICT | | fk_order_prod| prod_id| products | sku | SET NULL | NO ACTION | #### 方法2:查询引用当前(反向引用) ```sql SELECT kcu.TABLE_NAME AS '引用', kcu.COLUMN_NAME AS '引用列', kcu.CONSTRAINT_NAME AS '约束名', rc.DELETE_RULE AS '删除规则' FROM information_schema.KEY_COLUMN_USAGE kcu JOIN information_schema.REFERENTIAL_CONSTRAINTS rc ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME WHERE kcu.REFERENCED_TABLE_SCHEMA = 'your_database' AND kcu.REFERENCED_TABLE_NAME = 'your_table'; ``` **输出说明**: - 显示所有引用了当前关系 - 当删除当前记录时,会触发这些约束 ### 关字段说明 1. **删除规则**: - `CASCADE`:级联删除关联记录 - `SET NULL`:将设为NULL - `RESTRICT`:禁止删除(默认) - `NO ACTION`:同RESTRICT 2. **更新规则**: - 定义主更新时的行为 - 选项同删除规则 ### 使用示例 查询`sales_db`数据库中`orders`的所有: ```sql SELECT kcu.CONSTRAINT_NAME, kcu.COLUMN_NAME, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME, rc.DELETE_RULE FROM information_schema.KEY_COLUMN_USAGE kcu JOIN information_schema.REFERENTIAL_CONSTRAINTS rc ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME WHERE kcu.TABLE_SCHEMA = 'sales_db' AND kcu.TABLE_NAME = 'orders' AND kcu.REFERENCED_TABLE_NAME IS NOT NULL; ``` ### 注意事项 1. 需要`SELECT`权限访问`information_schema`数据库 2. 名和数据库名在Linux系统下区分大小写 3. 查询前建议检约束状态: ```sql SELECT @@FOREIGN_KEY_CHECKS; -- 1示启用,0示禁用 ``` 4. 批量操作时可临时禁用提高性能: ```sql SET FOREIGN_KEY_CHECKS = 0; -- 执行DDL操作 SET FOREIGN_KEY_CHECKS = 1; ``` > 通过以上方法,您可以全面掌握MySQL关系,为数据库设计和维护提供关信息[^1][^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值