加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 正文

MariaDB数据库的外键束缚实例详解

发布时间:2020-10-28 09:10:34 所属栏目:创业 来源:网络整理
导读:下面这篇文章首要给各人先容了关于MariaDB数据库的外键束缚的相干资料,文中通过示例代码先容的很是具体,必要的伴侣可以参考小心,下面跟着小编来一路进修进修
副问题[/!--empirenews.page--]

  短视频,自媒体,达人种草一站处事

束缚担保了数据的完备性和同等性。下面这篇文章首要给各人先容了关于MariaDB数据库的外键束缚的相干资料,文中通过示例代码先容的很是具体,必要的伴侣可以参考小心,下面跟着小编来一路进修进修吧

外键

外键的用途是确保数据的完备性。它凡是包罗以下几种:

1 实体完备性,确保每个实体是独一的(通过主键来实验)

2 域完备性,确保属性值只从一套特定可选的荟萃里选择

3 关联完备性,确保每个外键或是NULL(假如应承的话)或含有与相干主键值相配的值

1.什么是外键束缚

与主键束缚差异,建设外键束缚不会自动建设对应的索引。 可是因为以下缘故起因,对外键手动建设索引凡是是有效的:

当在查询中组合相干表中的数据时,常常在联接前提中行使外键列,要领是将一个表的外键束缚中的一列或多列与另一个表中的主键列或独一键列匹配。 索引使 数据库引擎 可以在外键表中快速查找相干数据。 可是,建设此索引并不是必须的。 纵然没有对两个相干表界说主键或外键束缚,也可以对来自这两个表中的数据举办组合,但两个表间的外键相关声名已用其键作为前提对其举办了优化,以便组合到查询中。

对主键束缚的变动可由相干表中的外键束缚搜查。

外键束缚(foreign key)就是表与表之间的某种约定的相关,因为这种相关的存在,我们可以或许让表与表之间的数据,越发的完备,关系性更强。

关于数据表的完备性和关系性,可以举个例子

有二张表,一张是用户表,一张是订单表:

1.假如我删除了用户内外的用户,那么订单表内里跟这个用户有关的数据,就成了无头数据了,不完备了。

2.假如我在订单表内里,任意插入了一条数据,这个订单在用户表内里,没有与之对应的用户。这样数据也不完备了。

假若有外键的话,就利便多了,可以不让用户删除数据,可能删除用户的话,通过外键同样删除订单表内里的数据,这样也能让数据完备。

通过外键束缚,每次插入或更新数据表时,城市搜查数据的完备性。

2.建设外键束缚

2.1 要领一:通过create table建设外键

语法:

create table 数据表名称(
...,
[CONSTRAINT [束缚名称]] FOREIGN KEY [外键字段]
 REFERENCES [外键表名](外键字段,外键字段2…..)
 [ON DELETE CASCADE ]
 [ON UPDATE CASCADE ]
)

参数的表明:

RESTRICT: 拒绝对父表的删除或更新操纵。

CASCADE: 从父表删除或更新且自动删除或更新子表中匹配的行。ON DELETE CASCADE和ON UPDATE CASCADE都可用

留意: on update cascade是级联更新的意思,on delete cascade是级联删除的意思,意思就是说当你更新或删除主键表,那外键表也会跟从一路更新或删除。

精简化后的语法:

foreign key 当前表的字段 references 外部表名 (关联的字段) type=innodb

2.1.1 插入测试数据

例子:我们建设一个数据库,包括用户信息表和订单表

MariaDB [book]> create database market;  # 建设market数据库
Query OK, 1 row affected (0.00 sec)

MariaDB [book]> use market;    # 行使market数据库
Database changed

MariaDB [market]> create table userprofile(id int(11) not null auto_increment, name varchar(50) not null default '', sex int(1) not null default '0', primary key(id))ENGINE=innodb; # 建设userprofile数据表,指定行使innodb引擎
Query OK, 0 rows affected (0.07 sec)

MariaDB [market]> create table user_order(o_id int(11) auto_increment, u_id int(11) default '0', username varchar(50), money int(11), primary key(o_id), index(u_id), foreign key order_f_key(u_id) references userprofile(id) on delete cascade on update cascade);  # 建设user_order数据表,同时为user_order表的u_id字段做外键束缚,绑定userprofile表的id字段
Query OK, 0 rows affected (0.04 sec)

MariaDB [market]> insert into userprofile(name,sex)values('HA',1),('LB',2),('HPC',1); # 向userprofile数据表插入三笔记录
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0

MariaDB [market]> select * from userprofile; # 查询userprofile数据表的全部记录
+----+------+-----+
| id | name | sex |
+----+------+-----+
| 1 | HA | 1 |
| 2 | LB | 2 |
| 3 | HPC | 1 |
+----+------+-----+
3 rows in set (0.00 sec)

MariaDB [market]> insert into user_order(u_id,username,money)values(1,'HA',234),(2,'LB',146),(3,'HPC',256);   # 向user_order数据表插入三笔记录
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0

MariaDB [market]> select * from user_order;  # 查询user_order数据表的全部记录
+------+------+----------+-------+
| o_id | u_id | username | money |
+------+------+----------+-------+
| 1 | 1 | HA | 234 |
| 2 | 2 | LB | 146 |
| 3 | 3 | HPC | 256 |
+------+------+----------+-------+
3 rows in set (0.00 sec)

MariaDB [market]> select id,name,sex,money,o_id from userprofile,user_order where id=u_id; # 联表查询
+----+------+-----+-------+------+
| id | name | sex | money | o_id |
+----+------+-----+-------+------+
| 1 | HA | 1 | 234 | 1 |
| 2 | LB | 2 | 146 | 2 |
| 3 | HPC | 1 | 256 | 3 |
+----+------+-----+-------+------+
3 rows in set (0.03 sec)

2.1.2 测试级联删除

MariaDB [market]> delete from userprofile where id=1; # 删除user表中id为1的数据
Query OK, 1 row affected (0.01 sec)

MariaDB [market]> select id,name,sex,money,o_id from userprofile,user_order where id=u_id;
+----+------+-----+-------+------+
| id | name | sex | money | o_id |
+----+------+-----+-------+------+
| 2 | LB | 2 | 146 | 2 |
| 3 | HPC | 1 | 256 | 3 |
+----+------+-----+-------+------+
2 rows in set (0.00 sec)

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读