msyql的主键和外键
概念(很多都是屁话)
1.外键约束
mysql通过外键约束来保证表与表之间的数据完整性和和准确性
外键的使用条件:
1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;
#dage是主键
CREATE TABLE `dage` ( `id` int(11) NOT NULL auto_increment,
`name` varchar(32) default '',
PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=utf8;
#xiaodi是外键 :外键 REFERENCES 主键 (外键依赖主键,或外键引用主键,倒8是外键) 先有主键才有外键
CREATE TABLE `xiaodi` (
`id` int(11) NOT NULL auto_increment,
`dage_id` int(11) default NULL,
`name` varchar(32) default '',
PRIMARY KEY (`id`),
KEY `dage_id` (`dage_id`),
CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
#修改小弟的外键(删掉小弟的外键)
ALTER TABLE xiaodi drop foreign key xiaodi_ibfk_1;
#给外键约束增加事件触发限制
ALTER TABLE xiaodi ADD FOREIGN KEY(dage_id) REFERENCES dage(id) ON DELETE CASCADE ON UPDATE CASCADE;
#往大哥插入一个数据(之后才能插小弟,因为大哥的是主键,小弟是外键)
INSERT INTO dage(name) VALUES('铜锣湾');
#往小弟表插入一个数据(没有大哥前是不可以增加小弟的)
INSERT INTO xiaodi(dage_id,name) VALUES(2,'铜锣湾小弟0');
#删除大哥(有了外键约束的事件触发限制) ,可以干掉大哥(小弟自动出局)
DELETE FROM dage WHERE id =2;#因为ON DELETE CASCADE