如何获得某个表的外键关系

szzfl 2009-08-05 09:59:58
我想问如何通过PHP或者mysql获得一个表的外键参照情况,desc tablename、show columns from talbename只能知道该列是主键,外键,我想获得具体的情况。比方:
CREATE TABLE Users(
ID int UNSIGNED NOT NULL auto_increment,
RoleID int UNSIGNED NOT NULL,
DepartmentID int UNSIGNED NOT NULL,

foreign key (RoleID) references Roles(ID),
foreign key (DepartmentID) references Departments(ID),
PRIMARY KEY (ID)
);
我想获得Users表的外键情况,想知道本表有哪此字段具有参照关系,参照哪个表的哪个字段。
...全文
175 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
libaohui2009 2009-08-17
  • 打赏
  • 举报
回复
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME =$tablename and CONSTRAINT_NAME LIKE 'fk_%';
煤油灯 2009-08-12
  • 打赏
  • 举报
回复
太有才了:(
dzxccsu 2009-08-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 szzfl 的回复:]
不好意思,回复得太慢。但是
CREATE TABLE Users(
  ID int UNSIGNED NOT NULL auto_increment,
  RoleID int UNSIGNED NOT NULL,
  DepartmentID int UNSIGNED NOT NULL,

  PRIMARY KEY  (`ID`),
  KEY `RoleID` (`RoleID`),
  KEY `DepartmentID` (`DepartmentID`)
)engine=myisam;
一样能创建表啊,myisam是怎么处理外键的,约束关系还存在吗?

[/Quote]myisam不支持外健,innodb才支持!
szzfl 2009-08-12
  • 打赏
  • 举报
回复
不好意思,回复得太慢。但是
CREATE TABLE Users(
ID int UNSIGNED NOT NULL auto_increment,
RoleID int UNSIGNED NOT NULL,
DepartmentID int UNSIGNED NOT NULL,

PRIMARY KEY (`ID`),
KEY `RoleID` (`RoleID`),
KEY `DepartmentID` (`DepartmentID`)
)engine=myisam;
一样能创建表啊,myisam是怎么处理外键的,约束关系还存在吗?
foolbirdflyfirst 2009-08-10
  • 打赏
  • 举报
回复
myisam引擎仍未支持外键,innodb才支持,so.....
szzfl 2009-08-10
  • 打赏
  • 举报
回复
但是有时候获取不了。用show create table `Users`;

得到:
CREATE TABLE Users(
ID int UNSIGNED NOT NULL auto_increment,
RoleID int UNSIGNED NOT NULL,
DepartmentID int UNSIGNED NOT NULL,

PRIMARY KEY (`ID`),
KEY `RoleID` (`RoleID`),
KEY `DepartmentID` (`DepartmentID`)
);

这种情况你根本就不知道他是参照什么表哪个字段的,我比较了一下,当表是myisam引擎是会是这样,如果是innodb则会完全显示出来,这是为什么?又如何解决呢?

foolbirdflyfirst 2009-08-08
  • 打赏
  • 举报
回复
show create table `Users`;
可以得到
CREATE TABLE Users(
ID int UNSIGNED NOT NULL auto_increment,
RoleID int UNSIGNED NOT NULL,
DepartmentID int UNSIGNED NOT NULL,

foreign key (RoleID) references Roles(ID),
foreign key (DepartmentID) references Departments(ID),
PRIMARY KEY (ID)
);
这个建表串,你可以利用正则解析foreign key那两行。
szzfl 2009-08-07
  • 打赏
  • 举报
回复
describe tables 只可以知道哪些表是FK,不能知道具体参照哪个表的那个键,
show create table `Users`; 只是一个表结构,同样没有参照情况。

To Exbox:
导出,能否具体讲一下,你是说导出到一个文件,再从导出文件里得到参照情况?
foolbirdflyfirst 2009-08-06
  • 打赏
  • 举报
回复
mysql>show create table `Users`;
Exbox 2009-08-06
  • 打赏
  • 举报
回复
我一般是直接导出表结构(mysql或者phpmyadmin都行),因为设置过外键参照的表会提示限制导出,其实也就可以获得它实际的外键参照情况了。比如某个表使用导出会提示:

ALTER TABLE `users_profile`
ADD CONSTRAINT `users_profile_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`);
  • 打赏
  • 举报
回复
你能不能登录到服务器上?describe tables操作最能看清楚。
数据库系统之实体完整性约束 数据库系统之实体完整性约束 数据库完整性 数据库完整性 今天做了⼀道数据库的上机题,其中的⼀些知识觉得挺有⽤的,因此打算整理出来⼀篇博客来与⼤家分享⼀下。这⾥的语句针对的都是创建后所 需要的语句。 ⼀、题⽬ ⼀、题⽬ 1.练习定义三类完整性: (1)为student添加主码约束 (2)为course添加主码和外码约束 (3)为sc添加主码和外码约束 (4)为course添加cname取值唯⼀的约束 (5)为course添加credit默认值为4的default约束 (6)为student添加check约束,ssex取值只能为男或⼥。 2.验证上⾯添加的约束 (1) 将student中学号为201910122的学号修改为201215123,验证主码约束机制。 (2) 将course中课程号为6的先⾏课号修改为9,验证外码约束机制。 (3) 向sc中添加⼀条记录,('666666666','1',80),验证外码约束机制。 (4) 修改student中学号为201215122的学⽣记录,将学号修改为'11111'验证外码约束机制。 (5) 删除student中学号为201215122的学⽣记录,验证外码约束机制。 (6) 将course中课程号为2号的课程名称修改为数据库,验证唯⼀约束机制。 3.删除上⾯添加的约束 (1)删除student的主码约束 (2)删除course的外码约束 (3)删除course中cname取值唯⼀的约束 ⼆、题⽬准备 ⼆、题⽬准备 此次上机需要的各个数据库各个字段的数据类型为: 此次上机需要的各个数据库各个字段的数据类型为: 1.student 2.course 3.sc 此次上机需要的各个数据库数据为: 此次上机需要的各个数据库数据为: 1.student 2.course 3.sc 三、题⽬分析 三、题⽬分析 1.练习定义三类完整性: 练习定义三类完整性: (1)为 为student添加主码约束 添加主码约束 添加主码约束的MySQL语句是:alter table 名 add primary key(列名); 因为主码必须需要唯⼀并且数据不能重复,发现在student中只有sno(学号)是每个⼈唯⼀标识。 因此这⾥只需输⼊这个语句即可:alter table student add primary key(sno); 最后检验是否成功,输⼊desc student; (2)为 为course添加主码和外码约束 添加主码和外码约束 1.添加主码约束 根据第⼀步我们可以知道cno(课程号)是唯⼀标识 因此添加主码约束的语句是:alter table course add primary key(cno); 最后检验是否成功,输⼊desc course; 2.添加外码约束 添加外码约束的MySQL语句是:alter table 名 add constraint 约束名 foreign key(关联字段) references 主(关联字段) 其中constraint 约束名可以省略,即也可以写成:alter table 名 add foreign key(关联字段) references 主(关联字段) ⾸先先尝试⼀下使⽤course的cpno来参照sc的cpno: alter table course add foreign key(cpno) references sc(cpno); ,发现报错 这是因为在参照时候,参照的和被参照的都需要是同⼀种数据类型和长度,⽐如tinyint类型的只能参照tinyint类型的,不能参照char(9)类型的。 同样的,数据长度不⼀样也不能进⾏参照,char(9)类型的也不能参照char(4)的。 因此我们把cpno的数据类型更改⼀下再试⼀次 先更改cpno字段的数据类型:alter table sc modify cpno tinyint; 然后再次输⼊上⾯的语句。 成功了 (3)为 为sc添加主码和外码约束 添加主码和外码约束 1.添加主码约束 根据第⼀步我们可以知道cpno是唯⼀标识 因此添加主码约束的语句是:alter table sc primary key(cpno); 最后检验是否成功,输⼊desc sc; 2.添加外码约束 使⽤sc的sno参照student的sno:alter table sc add foreign key(sno) references student(sno); (4)为 为course添加 添加cname取值唯⼀的约束 取值唯⼀的约束 添加取值唯⼀约束的MySQL的语句是:alter table 名 add uniqu

21,890

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧