> 데이터 베이스 > MySQL 튜토리얼 > MySQL零散笔记--外键_MySQL

MySQL零散笔记--外键_MySQL

WBOY
풀어 주다: 2016-06-01 13:51:27
원래의
967명이 탐색했습니다.

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能够实现自动操作时,如果键的关系没有设置好,可能会导致严重的数据破坏。

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿