/*
Navicat MySQL Data Transfer
Source Server : localhost_3306
Source Server Version : 50549
Source Host : localhost:3306
Source Database : testmarket
Target Server Type : MYSQL
Target Server Version : 50549
File Encoding : 65001
Date: 2017-09-11 17:10:43
*/
SET FOREIGN_KEY_CHECKS=;
-- ----------------------------
-- Table structure for god 账单(商品)表 子表(从表)
-- ----------------------------
DROP TABLE IF EXISTS `god`;
CREATE TABLE `god` (
`gid` int() NOT NULL AUTO_INCREMENT,
`gname` varchar() NOT NULL,
`gnumber` int() NOT NULL,
`gunit` varchar() NOT NULL,
`gprice` double(,) NOT NULL,
`gpay` int() NOT NULL,
`pname` varchar() NOT NULL,
`gdesc` varchar() DEFAULT NULL,
`gdate` varchar() NOT NULL,
PRIMARY KEY (`gid`),
KEY `pname` (`pname`), #级联删除 更新 sql语句可以成功运行
CONSTRAINT `pname` FOREIGN KEY (`pname`) REFERENCES `provide` (`pname`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for provide 供应商 主表(父表) 提供外键
-- ----------------------------
DROP TABLE IF EXISTS `provide`;
CREATE TABLE `provide` (
`pid` int() NOT NULL AUTO_INCREMENT,
`pname` varchar() NOT NULL,
`pdesc` varchar() DEFAULT NULL,
`pcontact` varchar() NOT NULL,
`pphone` int() NOT NULL,
`paddr` varchar() NOT NULL,
PRIMARY KEY (`pid`),
KEY `pname` (`pname`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of provide
-- ----------------------------
INSERT INTO `provide` VALUES ('', '苹果公司', 'iphone', '乔布斯', '', '美国');
INSERT INTO `provide` VALUES ('', '小米科技', '小米手机', '雷军', '', '北京');
INSERT INTO `provide` VALUES ('', '华为', '', '大嘴', '', '深圳');
INSERT INTO `provide` VALUES ('', '中兴', '中兴电子', '王', '', '北京');
INSERT INTO `provide` VALUES ('', '三星', '', '罗', '', '韩国');
-- ----------------------------
-- Records of god
-- ----------------------------
INSERT INTO `god` VALUES ('', '米2s', '', '元', '4000.00', '', '小米科技', '', '2013-03-12');
INSERT INTO `god` VALUES ('', 'iphone4', '', '元', '86000.00', '', '苹果公司', '', '2013-03-12');
INSERT INTO `god` VALUES ('', '米2', '', '元', '46999.00', '', '小米科技', '', '2013-04-12');
INSERT INTO `god` VALUES ('', '米3', '', '元', '22222.00', '', '小米科技', '', '2013-03-12');
INSERT INTO `god` VALUES ('', 'iphone5', '', '元', '150000.00', '', '小米科技', '', '2013-03-12');
INSERT INTO `god` VALUES ('', 'iiii', '', '元', '12.00', '', '苹果公司', '', '2012-2-2');
INSERT INTO `god` VALUES ('', 'iiii', '', '元', '12.00', '', '苹果公司', '', '2012-2-2');
-- ---------------------------

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`uname` varchar(50) NOT NULL,
`upwd` varchar(50) NOT NULL,
`usex` int(50) NOT NULL,
`uage` int(11) NOT NULL,
`uphone` int(11) NOT NULL,
`uaddr` varchar(50) DEFAULT NULL,
`urole` int(11) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('', 'zhangsan', '', '', '', '', '上海', '');
INSERT INTO `user` VALUES ('', 'lisi', '', '', '', '', '北京', '');
INSERT INTO `user` VALUES ('', 'wangwu', '', '', '', '', '上海', '');
SET FOREIGN_KEY_CHECKS=;
1.商品表


2.供应商表:

问题:查询出不同供应商的名称、编号、交易总额、商品总量及其总商品数量,没有的记为0,写出对应sql语句?

错误答案:

SELECT provide.pid as '供应商编号',provide.pname as '供应商名称', sum(god.gprice) as '总交易金额' from god,provide where provide.pname in(select provide.pname from provide ) and god.pname=provide.pname group by provide.pname;

只有现实小米科技2和苹果公司 因为provide.pname = god.pname 关联的话就是查询公共的 而三星 中兴 华为在供应商表中是没有的 所以使用左右外连接

正确解答:

SELECT provide.pid as '供应商编号',provide.pname as '供应商名称', IFNULL(SUM(god.gprice),0) as '总交易金额',IFNULL(COUNT(god.pname),0) as '商品总量',IFNULL(SUM(god.gnumber),0) as '总商品数量'
FROM provide
LEFT JOIN god
ON provide.pname = god.pname
GROUP BY provide.pname

2.SET FOREIGN_KEY_CHECKS=0/1的作用?

在mysql中取消外键,Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。

 解决方法是在Mysql中取消外键约束:  SET FOREIGN_KEY_CHECKS=0;  然后将原来表的数据导出到sql语句,重新创建此表后,再把数据使用sql导入,然后再设置外键约束: SET FOREIGN_KEY_CHECKS=1;  
当然欲使sql语句的级联更新和删除成功  应该也要加上 ON DELETE SET NULL ON UPDATE CASCADE

 
3.

先看On Delete属性,可能取值如上图为:No Action, Cascade,Set Null, Restrict属性。

当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。

当取值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。

当取值为Set Null时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)

当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新。

当取值为Cascade时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也更新外键在子表(即包含外键的表)中的记录。

当取值为Set Null时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。

4.扩展一个主外键的例子

简单描述:
这些关系基本上依靠外键进行管理,在关系中所有表中具有相同含义的字段作为公共部分来连接不同表中的记录。外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。

MySQL中“键”和“索引”的定义相同, 所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。

有两张表,第一张表是记录公司有多少人,都有谁,也就是员工编号及员工姓名这些基本表。另一张表记录每个月发给用户多少工资,所谓工资表是也。
但是工资表里面不能以员工姓名为主键,同样要通过员工id,因为员工的姓名是可能重复的啊。部门经理叫张三,小弟也叫张三,那这俩张三的工资能一样 吗?
并且员工表里面的每个人都有工资,否则谁也不给你干活,且一个人只能有一份工资,否则老板也不同意了。所以员工表和工资表是通过员工id进行关联的一 对一关系。
/*
建立员工表
*/
create table employees (
id int() not null auto_increment ,
name varchar() not null,
primary key (id)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;#5表示设置自增的起始值 可省略
/*
建立工资表
*/
create table payroll(
id int() not null,
emp_id int() not null,
name varchar() not null,
payroll float(,) not null,
primary key(id),
index emp_id (emp_id),
foreign key (emp_id) references employees (id)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
参照完整性:
当外键与另一个表的字段有关系,而且这种关系是惟一时,这个系统就称为处于参照完整性的状态。也就是说,如果一个字段在所有的表中只出现一次,而且每个表的这个字段
的变化都会影响其他表,这就是存在参照完整性。术语理解上可能不太方便,其实就是说要在有外键的表中保持所有数据的一致性。比如说“张三”离职了,在员工表里面肯定
没有这个人了,可是如果在工资表里面还存在这个孩子,那么老大就会很生气的

MySQL的外键只能在InnoDB表中使用:所以,如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果想要在MySQL中根据参照完整性来建立表并且希望在此基础上保持良好的性能,最好选择表结构为innoDB类型。

MySQL创建外键语法:

创建外键的语法是这样的:FOREIGN KEY (当前表的字段名)… REFERENCES 参照表 (参照表的字段名)

foreign key (emp_id) references employees (id); 的意思就是说当前表的emp_id字段是以employees的id字段为外键的。

注意事项:

一旦建立外键,MySQL只允许向当前表中加入外键表中已有的数据列。比如说贪官表里有“王二麻子”,那么在情妇表只才能有“王二麻子的情妇”。也就是说只有确认一个人是贪官了,才能把其情妇信息列入此表中,否则是不行滴。 
关系中的所有表必须是innoDB表,在非InnoDB表中,MySQL将会忽略FOREIGN KEY…REFERENCES修饰符。 
用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。 
在外键关系中,字段的数据类型必须相似,这对于大小和符号都必须匹配的整数类型尤其重要。 
即使表存在外键约束,MySQL还允许我们删除表,并且不会产生错误(即使这样做可能会破坏更早创建的外键) 
删除外键方法:(上面已经细致说明)

mysql标准写法及其他常见问题的更多相关文章

  1. html标记语言的标准写法-参考自http://www.zhihu.com/question/20797118/answer/16212312

    网页头部的声明应该是用 lang="zh" 还是 lang="zh-cn"?   添加评论   查看全部 12 个回答   skydiver ,程序员 5 人赞 ...

  2. 在系统方法中调用navigationController的标准写法

    在系统方法中调用navigationController的标准写法 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animat ...

  3. $.ajax()参数详解及标准写法(转)

    1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...

  4. 探寻main函数的“标准”写法,以及获取main函数的参数、返回值

    main函数表示法        很多同学在初学C或者C++时,都见过各种各样的main函数表示法: main(){/*...*/} void main(){/*...*/} int main(){/ ...

  5. jQuery ajax 标准写法及进度条绘制

    jQuery ajax 标准写法及进度条绘制 $.ajax({ url: "http://www.microsoft.com", //请求的url地址 dataType: &quo ...

  6. 常用的MySQL语句写法

    常用的MySQL语句写法 MySQL的SQL语句写法,除了那些基本的之外,还有一些也算比较常用的,这里记录下来,以便以后查找.     好记性不如烂笔头,这话说的太有道理了,一段时间不写它,还真容易忘 ...

  7. 从IntToHex()说起,栈/堆地址标准写法 good

    学习中的一些牢骚.栈/堆地址标准写法. 2017-02-12 • 杂谈 • 暂无评论 • 老衲 •浏览 226 次 我一直都在寻找各种业务功能的最简单写法,用减法的模式来开发软件.下面是我的写法,如果 ...

  8. JQuery的Ajax标准写法

    Ajax的标准写法 $.ajax({ url:"http://www.xxx",//请求的url地址 dataType:"json",//返回的格式为json ...

  9. ajax标准写法

    ajax 标准写法 $.ajax({ url:"http://www.microsoft.com", //请求的url地址 dataType:"json", / ...

随机推荐

  1. linux下memcached安装 和redis安装,jdk,tomcat,mysql 安装

    一.memcached安装yum  search  memcachedyum  -y install memcachedmemmcached -h service memcached restartc ...

  2. 获取AppStore上架后的应用版本号

    应用通过审核以后,由开发者设置应用上架,但何时能在appstore搜索到该应用,这个时间不等,有时候15分钟左右有时候2个多小时,以前就是隔一段时间打开网页然后刷新一下,或者搜索一下,查看版本号,操作 ...

  3. 在Android中实现图片的裁剪

        本实例的功能是将用户选择的图片裁剪后放入ImagView,布局文件是个Button和ImageView.为了图片的正常显示,我们在裁剪后先将裁剪好的图片先存放到SD卡中,这样就能在以后开启应用 ...

  4. Java(C#)基础差异-数组

    1.填充数组 Java 数组填充替换方法Arrays.fill() 举例如下: import java.util.Arrays; public class FillDemo { public stat ...

  5. Petri网

    Petri网是一种适合于系统描述和分析的数学模型,主要描述异步和并发关系.(或者Petri网是对离散并行系统的数学表示,适用于描述异步的,并发的计算机系统模型.) Petri网模型自然,直观,简单易懂 ...

  6. tcp常见状态

    常见状态 1.建立连接 2.关闭连接

  7. DNS使用的是TCP协议还是UDP协议(转)

    原文链接:DNS使用的是TCP协议还是UDP协议 DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类.但很少有人知道DNS分别在什么情 ...

  8. 整理:FPGA选型

    针对性整理下FPGA选型问题 一.获取芯片资料: 要做芯片的选型,首先就是要对有可能要面对的芯片有整体的了解,也就是说要尽可能多的先获取芯片的资料.现在FPGA主要有4个生产厂家,ALTERA,XIL ...

  9. 相声段子:How Are You

    /**************************************************************** File name : HowAreYou Author : 叶飞影 ...

  10. 如何将frm格式MYD格式MYI格式文件导入MySQL中

    frm,myd,myi是属于MySQL存储数据的文件,phpMyAdmin是无法导入的. phpMyAdmin支持的文件格式为sql文件. 其实很简单: 1.找到你的mysql的安装目录下的data文 ...