mysql 学习二: mysql中的外键使用
程序员文章站
2021-11-28 11:22:20
...
外键使用的好处在于可以帮助保持数据的一致性,当然缺点就是性能上的损失
而且只有在InnoDB类型的时候才可以使用外键
测试的基本顺序是这样
1. 建表
注意table shirt, 建立外键的语句和级联更新删除的语句
FOREIGN KEY (owner) REFERENCES PERSON(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY (id)
2. 插入数据
person表
INSERT INTO person VALUES (NULL, sean');
INSERT INTO person VALUES (NULL, 'chen');
INSERT INTO person VALUES (NULL, 'wei');
shirt表
INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', 1),
(NULL, 'polo', 'red', 2),
(NULL, 'dress', 'blue',1),
(NULL, 't-shirt', 'white',2);
注意:第四个字段是代表owner, 这里输入person表中的Id
建立起连接
3. 进行update关联测试
3.1 更新person表的id
update person set id= 3 where id = 1;
3.2 查看shirt表的owner变化
SELECT * FROM shirt;
结果:
最后owner为1的字段,内容变成3
4. 进行delete关联测试
4.1 删除Person表中id=3的内容
DELETE FROM PERSON WHERE id=3;
4.2 查看shirt表的变化
select * from shirt;
结果:发现owner=3的记录被删除
测试通过,发现数据保持一致。
另外,在shirt中尝试删除owner作为index, 系统报错
另外,作者做了些实验:
1. 尝试通过shirt表的字段改变,来改变person表的相关字段
update shirt set owner=10 where owner=2
报错
查了mysql手册,mysql5.0开始,自动把外键值作为index,详细请查看手册
2. mysql browser作为客户端工具,操作比较简单,容易上手,可以参考使用
3. 没有解决的问题:
shirt表中的owner作为index, 如何设置的?为什么不能取消?
还请高手赐教!
4. 建立外键的表,是跟谁被reference的进行修改
也就是shirt表跟谁着person表进行更改、删除
而不是相反的过程!
而且只有在InnoDB类型的时候才可以使用外键
测试的基本顺序是这样
1. 建表
CREATE TABLE person (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name CHAR(60) NOT NULL,
PRIMARY KEY (id)
)type=innoDB;
CREATE TABLE shirt (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
owner SMALLINT UNSIGNED NOT NULL,
FOREIGN KEY (owner) REFERENCES PERSON(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY (id)
)type=innoDB;
注意table shirt, 建立外键的语句和级联更新删除的语句
FOREIGN KEY (owner) REFERENCES PERSON(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY (id)
2. 插入数据
person表
INSERT INTO person VALUES (NULL, sean');
INSERT INTO person VALUES (NULL, 'chen');
INSERT INTO person VALUES (NULL, 'wei');
shirt表
INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', 1),
(NULL, 'polo', 'red', 2),
(NULL, 'dress', 'blue',1),
(NULL, 't-shirt', 'white',2);
注意:第四个字段是代表owner, 这里输入person表中的Id
建立起连接
3. 进行update关联测试
3.1 更新person表的id
update person set id= 3 where id = 1;
3.2 查看shirt表的owner变化
SELECT * FROM shirt;
结果:
最后owner为1的字段,内容变成3
4. 进行delete关联测试
4.1 删除Person表中id=3的内容
DELETE FROM PERSON WHERE id=3;
4.2 查看shirt表的变化
select * from shirt;
结果:发现owner=3的记录被删除
测试通过,发现数据保持一致。
另外,在shirt中尝试删除owner作为index, 系统报错
另外,作者做了些实验:
1. 尝试通过shirt表的字段改变,来改变person表的相关字段
update shirt set owner=10 where owner=2
报错
查了mysql手册,mysql5.0开始,自动把外键值作为index,详细请查看手册
2. mysql browser作为客户端工具,操作比较简单,容易上手,可以参考使用
3. 没有解决的问题:
shirt表中的owner作为index, 如何设置的?为什么不能取消?
还请高手赐教!
4. 建立外键的表,是跟谁被reference的进行修改
也就是shirt表跟谁着person表进行更改、删除
而不是相反的过程!