本博将对主键、外键、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()
);

  带复合主键的创建:

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

  主键自增:

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

  创建后再决定主键:

CREATE TABLE t1(
id int not null,
name char()
); 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;

  

  例2:select * from orders,orderitems;

  

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

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

  示例1:

for row1 in table1:
for row2 in table :
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;

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

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

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

  

  这样可以指定列输出

(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;

  例2:左外部链接

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

  输出了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;

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

MySql必知必会实战练习(四)主键、外键、sql约束、联结表的更多相关文章

  1. MySql必知必会实战练习(二)数据检索

    在上篇博客MySql必知必会实战练习(一)表创建和数据添加中完成了各表的创建和数据添加,下面进行数据检索和过滤操作. 1. Select子句使用顺序 select--->DISTINCT---& ...

  2. MySql必知必会实战练习(三)数据过滤

    在之前的博客MySql必知必会实战练习(一)表创建和数据添加中完成了各表的创建和数据添加,MySql必知必会实战练习(二)数据检索中介绍了所有的数据检索操作,下面对数据过滤操作进行总结. 1. whe ...

  3. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  4. MySQL必知必会1-20章读书笔记

    MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...

  5. MySQL必知必会》正则表达式

    <MySQL必知必会>正则表达式 正则表达式 1.1.关键字 REGEXP 正则表达式的使用需要用到关键字 REGEXP . select prod_name from products ...

  6. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

  7. mysql学习--mysql必知必会1

     例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式 ...

  8. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  9. mysql必知必会系列(一)

    mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...

  10. 《mysql必知必会》读书笔记--存储过程的使用

    以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书 ...

随机推荐

  1. 使用阿里的maven库

    快使用阿里云的maven仓库 自从开源中国的maven仓库挂了之后就一直在用国外的仓库,慢得想要砸电脑的心都有了.如果你和我一样受够了国外maven仓库的龟速下载?快试试阿里云提供的maven仓库,从 ...

  2. 通过自动回复机器人学Mybatis:OGNL+log4j.properties

    imooc视频学习笔记 ----> URL:http://www.imooc.com/learn/154 OGNL规则: 从哪里取?(作用域.取值范围,例如封装入一个对象,该对象就是取值范围) ...

  3. MySQL Binlog解析(1)

    一.Binlog File Binlog files start with a Binlog File Header followed by a series of Binlog Event Binl ...

  4. Linux下使用USB模拟ACM串口设备【转】

    本文转载自:https://www.cnblogs.com/pied/p/4549614.html 这个想法之前就在脑袋里有过,最近公司产品要用到,所以多做了些了解. 1. USB 简介 USB 是 ...

  5. Linux系统下修改IP地址、网关、DNS的基本方法

    临时修改IP地址.网关.主机名.DNS,马上生效,无需重启(重启后失效) 1.修改主机名 #hostname Slyar 2.修改IP地址(eth0为网卡名称) #ifconfig eth0 192. ...

  6. Percona 工具包 pt-online-schema-change 简介

    mysql的在线表结构修改,因为低效和阻塞读写.一直被诟病.至于ALTER TABLE 的原理,参看我上一篇文章.MySQL在线修改大表结构.看完后,发现的问题是还是会锁的,且对于在线更新的这块也是不 ...

  7. AngularJS Source code

    Angular.js 辅助函数 lowercase hasOwnProperty uppercase mannualLowercase mannualUppercase isArrayLike for ...

  8. MongoError: server instance in invalid state undefined 解决办法

    MongoDB关键点集锦(更新中...)  2017-01-20 09:33:48[其它数据库]点击数:15作者:Real_Bird的博客来源: 网络 随机为您推荐的文章:MongDB索引的介绍及使用 ...

  9. 关于setTimeout()你所不知道的地方,详解setTimeout()

    关于setTimeout()你所不知道的地方,详解setTimeout() 前言:看了这篇文章,1.注意setTimeout引用的是全部变量还是局部变量了,当直接调用外部函数方法时,实际上函数内部的变 ...

  10. IE报错:缺少标识符、字符串或数字

    在调试ExtJS程序时,在firefox和chrome上都能显示,但一到IE上就报错,后来从左下角的JS报错提示中才发现,原来是JS代码中多加了个逗号. menu: { items: [{ text: ...