MySql必知必会实战练习(四)主键、外键、sql约束、联结表

本博将对主键、外键、MySql数据库约束和联结表的相关特性进行总结和实战1.主键表中的每一行都应该具有可以唯一标识自己的一列(或一组列),而这个承担标识作用的列称为主键如果没有主键,数据的管理

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

  本博将对主键、外键、MySql数据库约束和联结表的相关特性进行总结和实战

1. 主键

  表中的每一行都应该具有可以唯一标识自己的一列(或一组列),而这个承担标识作用的列称为主键

  如果没有主键,数据的管理会十分混乱。比如会存在多条一模一样的记录,删除和修改特定行十分困难

(1)哪些列可以作为主键?

  任何列都可以作为主键,只要它满足以下条件:

  a. 任何两行都不具有相同的主键值,就是说这列的值都互不相同

  b. 每个行都必须具有一个主键值,主键列不允许设置为NULL

  c. 主键列的值不建议进行修改和更新

(2)主键的创建

  最简单的表:

CREATE TABLE t1(
   id int not null,
   name char(20)
);

  带主键的表的创建:

CREATE TABLE t1(
   id int not null primary key,
   name char(20)
);

  带复合主键的创建:

CREATE TABLE t1(
   id int not null,
   name char(20),
   primary key (id,name) 
);

  主键自增:

CREATE TABLE t1(
   id int primary key not null auto_increment,
   name char(20)
);

  创建后再决定主键:

CREATE TABLE t1(
   id int not null,
   name char(20)
);

alter table t1 add primary key (id);

2. 外键

  外键用来保证参照完整性,MySQL数据库的MyIsAM存储引擎本身并不支持外键,对于外键的定义只是起到一个注释的作用,而InonoDB存储引擎则完整支持外键约束。

  设置外键约束的两个表之间会具有父子关系,一般来说,称被引用的表为父表,引用的表称为子表,字表中外键的字段的取值范围由父表决定,并且数据类型必须和父表中一致。

  设置外键在一定程度上会降低数据库的速度。

(1)外键的添加

ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders (order_num);
ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products (prod_id);
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers (cust_id);
ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors (vend_id);

(2)外键删除

alter table products drop foreign key  fk_products_verdors;

3. MySql数据库完整性约束

  参考之前的博客:MySql数据库约束

4. 联结表

(1)等值联结

   说的直白点就是根据select语句将多个表联结在一起,但有一点需要注意的是联结不是物理试题,它在实际的数据库表中不存在,只存在于查询的执行当中。

  首先看下创建联结的例子:

  例1:select * from orders,orderitems where
     orders.order_num = orderitems.order_num;

  MySql必知必会实战练习(四)主键、外键、sql约束、联结表

  例2:select * from orders,orderitems;

  MySql必知必会实战练习(四)主键、外键、sql约束、联结表

  从上面两个例子能明显的看到使用where和不使用where的区别,在联结两个表时,你实际上做的是将第一个表中的每一行与第二个表中的每一行进行匹配,where语句作为过滤条件,它只包含那些匹配给定条件的行,没有where语句,第一个表中的每行将与第二个表中的每行进行配对,而不管他们的逻辑上否可以在一起,没有联结条件的表关系返回的结果为笛卡儿积,检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

  下面将用伪代码对两个示例进行区分:

  示例1:

for row1 in table1:
    for row2 in table 2:
         if row1.condition == row2.condition:
                print(row1+row2)

  示例2:

for row1 in table1:
    for row2 in table2:
        print(row1+row2)

(2)内部联结

  上面展示的等值联结,其实也称为内部联结,对于这种联结可以使用稍微不同的语法来明确指明联结的类型,INNER JOIN …. ON

select * from 
    orders INNER JOIN orderitems 
    ON orders.order_num = orderitems.order_num;

MySql必知必会实战练习(四)主键、外键、sql约束、联结表

  ANSI SQL规范首选INNER JOIN … ON语法,使用明确的联结语法确保不会忘记联结条件,有时候这样做也能影响性能。

(3)如果只想输出指定联结表的某列可以使用下列方法

select orders.*,orderitems.proc_id from 
    orders INNER JOIN orderitems 
    ON orders.order_num = orderitems.order_num;

  MySql必知必会实战练习(四)主键、外键、sql约束、联结表

  这样可以指定列输出

 (4)外部链接

  许多联结将一个表中的行与另一个表中的行相关联。但是有时候需要包含没有关联的那些行,这个时候就可以使用外部链接,外部联结方式有右链接RIGHT OUTERJOIN … ON和左联结LEFT OUTER JOIN…ON

  看下面的三个示例进行比较就一目了然了

  例1:内联结

SELECT customers.cust_id,orders.cust_id,orders.order_num
    from customers INNER JOIN orders
    ON customers.cust_id = orders.cust_id;

MySql必知必会实战练习(四)主键、外键、sql约束、联结表

  例2:左外部链接

SELECT customers.cust_id,orders.cust_id,orders.order_num
    from customers LEFT OUTER JOIN orders
    ON customers.cust_id = orders.cust_id;

MySql必知必会实战练习(四)主键、外键、sql约束、联结表

  输出了10002行,相当于前面伪代码中customers表为外循环,只是将custonmers中没匹配上的10002也输出了

  例3:右外部链接

SELECT customers.cust_id,orders.cust_id,orders.order_num
    from customers RIGHT OUTER JOIN orders
    ON customers.cust_id = orders.cust_id;

MySql必知必会实战练习(四)主键、外键、sql约束、联结表

  输出了10005行,相当于前面伪代码中orders作为外循环,将orders中没匹配上的10005进行了输出

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120052.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mui的时间控件 picker

    mui的时间控件 pickerhtml,body,.mui-content{height:0px;margin:0px;background-color:#efeff4;}h5.mui-content-padded{margin-left:3px;margin-top:20px!important;}h5.mui-content-padded:first-child

    2022年5月23日
    31
  • 一对兔子从出生后第三个月起每个月_兔子繁衍问题python

    一对兔子从出生后第三个月起每个月_兔子繁衍问题python7-6 兔子繁衍问题 (20分)一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?输入格式: 输入在一行中给出一个不超过10000的正整数N。输出格式: 在一行中输出兔子总数达到N最少需要的月数。 输入样例: 30 输出样例: 9#includ…

    2022年8月18日
    9
  • IM在线客服系统_开源在线客服系统附源码

    IM在线客服系统_开源在线客服系统附源码  在线客服系统比以往任何时候都更受欢迎,随着即时通讯巨头WhatsApp、FacebookMessenger和微信的崛起,即时通讯平台也正在接管商业通信。精简和用户友好的消息传递解决方案已经取代了电话、传真和电子邮件,它们使团队能够更成功地沟通和协作,即使是在混合的工作环境中。    在线客服系统及源码:zxkfym.top  什么是在线客服系统?    线客服系统是数字化工作场所的重要工具之一。它用于远程工作的员工之间的沟通和协作,从而使工作更容易、更快。尽管即时消息平台首先用.

    2022年7月19日
    15
  • vs2008连接tfs2013_VS连接SQL网页登录

    vs2008连接tfs2013_VS连接SQL网页登录偶尔还是会用到,老是忘记安装的顺序,在这儿mark一下。用VS2008连接TFS2010,需要按照以下顺序安装一下组件:.VS2008TeamExplorer2008      3.InstallVisualStudio2008SP1      4.InstallVSTS2008ForwardCompatibilityUpdate

    2022年9月23日
    3
  • centos7重启nginx「建议收藏」

    centos7重启nginx「建议收藏」1.找到nginx的安装位置whereisnginx2.进入该目录下cd/usr/sbin3.重启./nginx-sreload

    2022年8月13日
    8
  • Opencv学习笔记(九)光流法

    Opencv学习笔记(九)光流法原创文章,转贴请注明:http://blog.csdn.net/crzy_sparrow/article/details/7407604   本文目录:     一.基于特征点的目标跟踪的一般方法     二.光流法     三.opencv中的光流法函数    四.用类封装基于光流法的目标跟踪方法     五.完整代码     六.参考文献

    2022年7月23日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号