您好,欢迎访问一九零五行业门户网

MySQL零散笔记--外键_MySQL

mysql外键
references: 《浅谈mysql外键》《mysql创建外键关联》
mysql中“键”和“索引”的定义相同, 所以外键和主键一样也是索引的一种。不同的是mysql会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。//查看mysql手册发现从mysql 4.1.2开始会自动建立这个index
创建外键的实例代码:员工和工资表:
/*



建立员工表
*/



create table employees (
id int(5) not null auto_increment ,
name varchar(8) not null,

primary key (id)
)
type=innodb;


/*



建立工资表
*/



create table payroll(
id int(5) not null,
emp_id int(5) not null,
name varchar(8) not null,

payroll float(4,2) not null,
primary key(id),
index emp_id (emp_id),
foreign key (emp_id) references employees (id)
)
type = innodb;
参照完整性(referentialintegrity)通常通过外键(foreign key)的使用而被广泛应用,在mysql中通过新的innodb列表引擎支持。为了建立两个mysql表之间的一个外键关系,必须满足以下三种情况:
* 两个表必须是innodb表类型。  
* 使用在外键关系的域必须为索引型(index)。  
* 使用在外键关系的域必须与数据类型相似。
怪不得我试着创建带外键的表的时候出错呢,原来是之前的表不是innodb类型,果断该表表的类型:
alter table table-name type=innodb;
居然有warning。 show warnings之后发现原来是 “the syntax 'type=storage_engine' is deprecated and will be removed in mysql 6.0. please use 'engine=storage_engine' instead”  type已经out啦~以后要用engine了嗯
关于表类型(type/engine)的介绍,可以在这里找到:
《浅谈mysql表类型》,《mysql engine/type类型innodb/myisam/merge/bdb/heap的区别》
注意事项:
关系中的所有表必须是innodb表,在非innodb表中,mysql将会忽略foreign key…references修饰符。 用于外键关系的字段必须在所有的参照表中进行明确地索引,innodb不能自动地创建索引。 在外键关系中,字段的数据类型必须相似,这对于大小和符号都必须匹配的整数类型尤其重要。 即使表存在外键约束,mysql还允许我们删除表,并且不会产生错误(即使这样做可能会破坏更早创建的外键)  
删除外键方法:
alter table table-name drop foreign key key-id;
这里有一个概念,这个外键的id是啥玩意?我们可以通过show create table 命令来获得key-id的值。
/*



显示建表结构语句,key-id为payroll_ibfk_1
*/



show create table payroll /g
/*



*************************** 1. row ***************************
table: payroll
create table: create table `payroll` (
`id` int(5) not null,
`emp_id` int(5) not null,
`name` varchar(8) not null,
`payroll` float(4,2) not null,
primary key (`id`),
key `emp_id` (`emp_id`),
constraint `payroll_ibfk_1` foreign key (`emp_id`) references `employees` (`id`)
) engine=innodb default charset=latin1
1 row in set (0.00 sec)


*/



自动键更新和删除:
mysql可能通过向foreign key…references 修饰符添加一个on delete或on update子句简化任务,它告诉了数据库在这种情况如何处理孤立任务。
关键字 含义
cascade 删除包含与已删除键值有参照关系的所有记录.就是删除外键记录
set null 修改包含与已删除键值有参照关系的所有记录,使用null值替换(只能用于已标记为not null的字段)
restrict 拒绝删除要求,直到使用删除键值的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置)
no action 啥也不做
请注意,通过 on update 和on delete规则,设置mysql能够实现自动操作时,如果键的关系没有设置好,可能会导致严重的数据破坏。
其它类似信息

推荐信息