怪不得我试着创建带外键的表的时候出错呢,原来是之前的表不是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的区别》
注意事项:
删除外键方法:
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能够实现自动操作时,如果键的关系没有设置好,可能会导致严重的数据破坏。