精华内容
下载资源
问答
  • 之间的关系 一对多关系。例:客户与联系人 (1)一对一:一个分类里面有多个商品,一个商品只能属于一个分类。 (2)一对多:一个客户有很多联系人,一个联系人只能属于一个客户。 多对多关系。例:用户和...

    表与表之间的关系

    1. 一对多关系。例:客户与联系人
      (1)一对一:一个分类里面有多个商品,一个商品只能属于一个分类。
      (2)一对多:一个客户有很多联系人,一个联系人只能属于一个客户。
    2. 多对多关系。例:用户和角色
      订单和商品的关系:一个订单里面有很多商品,一个商品属于多个订单。
      用户和角色的关系:总经理可以兼任司机,保安可以兼任秘书。

    一对多表的实现

    以客户与联系人为例,先创建对应的class文件。

    //客户的实体类
    package cn.zzuli.lhk;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class t_Customer {
    		private Integer cid;
    		private String name;
    		private String gender;
    		private String work;
    		private String phone;
    		private String Mobile;
    		private Set<t_LinkMan> setLinkMan = new HashSet<t_LinkMan>();
    		
    		public Set<t_LinkMan> getSetLinkMan() {
    			return setLinkMan;
    		}
    		public void setSetLinkMan(Set<t_LinkMan> setLinkMan) {
    			this.setLinkMan = setLinkMan;
    		}
    		public Integer getCid() {
    			return cid;
    		}
    		public void setCid(Integer cid) {
    			this.cid = cid;
    		}
    		public String getName() {
    			return name;
    		}
    		public void setName(String name) {
    			this.name = name;
    		}
    		public String getGender() {
    			return gender;
    		}
    		public void setGender(String gender) {
    			this.gender = gender;
    		}
    		public String getWork() {
    			return work;
    		}
    		public void setWork(String work) {
    			this.work = work;
    		}
    		public String getPhone() {
    			return phone;
    		}
    		public void setPhone(String phone) {
    			this.phone = phone;
    		}
    		public String getMobile() {
    			return Mobile;
    		}
    		public void setMobile(String mobile) {
    			Mobile = mobile;
    		}
    		
    }
    
    
    //联系人的实体类
    package cn.zzuli.lhk;
    
    public class t_LinkMan {
    	private Integer lid;
    	private String name;
    	private String gender;
    	private String phone;
    	private Integer clid;
    	private t_Customer customer;
    	
    	
    	public Integer getClid() {
    		return clid;
    	}
    	public void setClid(Integer clid) {
    		this.clid = clid;
    	}
    	public t_Customer getCustomer() {
    		return customer;
    	}
    	public void setCustomer(t_Customer customer) {
    		this.customer = customer;
    	}
    	public Integer getLid() {
    		return lid;
    	}
    	public void setLid(Integer lid) {
    		this.lid = lid;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getGender() {
    		return gender;
    	}
    	public void setGender(String gender) {
    		this.gender = gender;
    	}
    	public String getPhone() {
    		return phone;
    	}
    	public void setPhone(String phone) {
    		this.phone = phone;
    	}
    }
    
    

    配置xml属性文件。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        <!-- 客户的xml文件 -->
    <hibernate-mapping>
    	<class name = "cn.zzuli.lhk.t_Customer" table="t_Customer">
    		<id name = "cid" column = "cid">
    			<generator class="native"></generator>		
    		</id>
    		<property name="name" column = "name"></property>
    		<property name="gender" column = "gender"></property>
    		<property name="work" column = "work"></property>
    		<property name="phone" column = "phone"></property>
    		<property name="Mobile" column = "Mobile"></property>
    		<!-- name属性值为客户实体类中的联系人集合的名称 
    			双向维护外键,要做到前后外键名称一致
    		-->
    		<set name="setLinkMan">
    			<key column = "clid"></key>
    			<one-to-many class = "cn.zzuli.lhk.t_LinkMan"/>
    		</set>
    	</class>
    </hibernate-mapping>
       
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        <!-- 联系人的xml文件 -->
    <hibernate-mapping>
    	<class name = "cn.zzuli.lhk.t_LinkMan" table = "t_LinkMan">
    		<id name = "lid" column = "lid">
    			<generator class="native"></generator>
    		</id>
    		<property name="name" column = "name"></property>
    		<property name="gender" column = "gender"></property>
    		<property name="phone" column = "phone"></property>
    		<!-- 双向维护外键 
    		name属性值为联系人实体类中Customer对象名称,这个很重要
    		-->
    		<many-to-one name = "customer" class = "cn.zzuli.lhk.t_Customer" column = "clid"></many-to-one>
    	</class>
    </hibernate-mapping>
       
    

    测试。

    package cn.zzuli.test;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.junit.jupiter.api.Test;
    
    import cn.zzuli.lhk.t_Customer;
    import cn.zzuli.lhk.t_LinkMan;
    import hibernateUtils.hibernateUtils;
    
    public class hbtest2 {
        
    	@Test
    	public void testadd() {
    		
    		SessionFactory sessionfactory = null;
    		
    		//连接
    		Session session = null;
    		//开启事务
    		Transaction tx = null;
    		try {
    			sessionfactory = hibernateUtils.getSessionFactoryUtils();
    			
    			//连接
    			session = sessionfactory.openSession();
    			//开启事务
    			tx = session.beginTransaction();
    				
    				t_Customer customer = new t_Customer();
    				customer.setCid(1);
    				customer.setGender("男");
    				customer.setName("卓一");
    				customer.setMobile("15865946624");
    				customer.setPhone("03740081");
    				customer.setWork("政协委员");
    				
    				t_LinkMan linkman = new t_LinkMan();
    				linkman.setLid(1);
    				linkman.setName("王二");
    				linkman.setGender("男");
    				linkman.setPhone("15265658594");
    				//linkman.setClid(customer.getCid());
    				
    				customer.getSetLinkMan().add(linkman);
    				linkman.setCustomer(customer);
    				
    				session.save(customer);
    				session.save(linkman);
    				
    				tx.commit();
    		}catch(Exception e){
    			tx.rollback();
    			
    		}finally {
    				session.close();
    				sessionfactory.close();
    		}
    	}
    }
    
    

    得出结论。
    客户
    联系人

    个人感悟

    这个一对多建表我搞了很长时间,其中印象最深刻的就是配置文件这一过程,由于不细心对后期排查造成了很大困难,出现了各种各样的报错,也想过求援,但是代码是自己敲得,技术上不会了可以问一下子,排查bug的过程必须自己来做,这个感想算是纪念独立解决bug的一天。

    展开全文
  • 如何设计数据主键

    千次阅读 2011-11-29 14:37:50
    建立一个数据库表的时候,有时会用自然主键作为整个表的主键,例如我们用商品编码作为商品表的主键。 这种方式带来的问题在于,假如数据库中有Product和ProductDetails两个表,ProductDetails通过ProductID外键...

    在建立一个数据库表的时候,有时会用自然主键作为整个表的主键,例如我们用商品编码作为商品表的主键。

    这种方式带来的问题在于,假如数据库中有Product和ProductDetails两个表,ProductDetails通过ProductID外键引用Product表,如果我们需要修改ProductID(由于输入错误或者产品码就需要更改),那将是一件非常头疼的事,因为如果修改Product表的ProductID那么会因为ProductDetails引用该主键而很难修改,如果修改ProductDetails表的ProductID外键,那么会因为Product表中没有相应的值而无法修改,总之这简直就像一个恶梦。

    因此,设置数据表主键的最佳实践是:

    使用一个没有意义的整数值作为数据表主键(使用整数值会提高数据库的查询速度),在T-SQL中就是使用IDENTITY [ ( seed, increment ) ]函数。

    Identity函数的第一个参数表示第一列的初始值;第二个参数表示每一列之间数值增长的步长,默认为IDENTITY (1, 1).

    下面是一个标准的建表语句:

    CREATE TABLE [FAC].[AlarmMessages]
    (
    [ID] [int] NOT NULL IDENTITY(1, 1),
    [AlarmId] [uniqueidentifier] NOT NULL,
    [ServiceId] [int] NOT NULL,
    [HostName] [nvarchar] (50) NOT NULL,
    [ContextType] [nvarchar] (50) NOT NULL,
    [Component] [nvarchar] (50) NOT NULL,
    [AlarmedTime] [datetime] NOT NULL,
    [Message] [nvarchar] (max) NOT NULL,
    [AlarmedUser] [nvarchar] (50) NOT NULL,
    [TimeToLive] [datetime] NULL,
    [IsActive] [Bit] NOT NULL, 
    [ClearTime] [datetime] NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    


    展开全文
  • 数据库—连接查询

    2020-08-30 23:39:08
    案例中应该包括三张表依次是:用户表、订单表、商品表 其中用户表与订单表示一对多的关系、订单表与商品表示多对多的关系 下面通过图解来分析如何建立他们之间的联系: 对于一对多如何建立联系通常是:从表(多表一方)...

    1.连接查询

    案例:张三、李四等人去商场买了一些物品花了一些钱

    案例中应该包括三张表依次是:用户表、订单表、商品表

    其中用户表与订单表示一对多的关系、订单表与商品表示多对多的关系

    下面通过图解来分析如何建立他们之间的联系:

    对于一对多如何建立联系通常是:从表(多表一方)添加外键约束,引用主表(单表一方)的主键约束

    其中外键约束是 主表的表名_id 。

    在这里插入图片描述

    sql语句:

    -- 用户表
    CREATE TABLE `user`(
    `uid`INT PRIMARY KEY,
    `username` VARCHAR(20) NOT NULL UNIQUE
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    
    -- 插入数据
    insert into `user` (`uid`, `username`) values('3','张三');
    insert into `user` (`uid`, `username`) values('4','李四');
    insert into `user` (`uid`, `username`) values('5','王五');
    insert into `user` (`uid`, `username`) values('6','赵六');
    

    用户表与订单表示一对多关系直接套公式:从表(多表一方)添加外键约束,引用主表(单表一方)的主键约束

    其中外键约束是 主表的表名_id 。

    ALTER TABLE `orders` ADD FOREIGN KEY(`user_id`) REFERENCES `user`(`uid`);
    
    -- 订单表
    CREATE TABLE `orders`(
    `oid` INT PRIMARY KEY,
    `totalprice` DOUBLE,
    `user_id` INT
    )ENGINE=INNODB DEFAULT CHARSET=utf8 
    -- 插入数据
    insert into `orders` (`oid`, `totalprice`, `user_id`) values('1','1000','3');
    insert into `orders` (`oid`, `totalprice`, `user_id`) values('2','800','3');
    insert into `orders` (`oid`, `totalprice`, `user_id`) values('3','1250','4');
    insert into `orders` (`oid`, `totalprice`, `user_id`) values('4',NULL,'5');
    insert into `orders` (`oid`, `totalprice`, `user_id`) values('5',NULL,NULL);
    

    因为多对多表查询不好建立联系,所以引用中间表。可以看成两个一对多表

    ALTER TABLE `middle` ADD FOREIGN KEY(`orders_id`) REFERENCES `orders`(`oid`);
    ALTER TABLE `middle` ADD FOREIGN KEY(`product_id`)REFERENCES `product`(`pid`);
    
    -- 中间表
    CREATE TABLE `middle`(
    `orders_id` INT,
    `product_id`INT
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    
    -- 插入数据
    insert into `middle` (`orders_id`, `product_id`) values('1','1');
    insert into `middle` (`orders_id`, `product_id`) values('1','2');
    insert into `middle` (`orders_id`, `product_id`) values('2','2');
    insert into `middle` (`orders_id`, `product_id`) values('2','3');
    insert into `middle` (`orders_id`, `product_id`) values('3','1');
    insert into `middle` (`orders_id`, `product_id`) values('3','2');
    insert into `middle` (`orders_id`, `product_id`) values('3','4');
    
    -- 商品表
    CREATE TABLE `product`(
    `pid` INT PRIMARY KEY,
    `pname` VARCHAR(10) NOT NULL UNIQUE,
    `price` DOUBLE
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    -- 插入数据
    insert into `product` (`pid`, `pname`, `price`) values('1','电视机','600');
    insert into `product` (`pid`, `pname`, `price`) values('2','电风扇','400');
    insert into `product` (`pid`, `pname`, `price`) values('3','衣柜','400');
    insert into `product` (`pid`, `pname`, `price`) values('4','吹风机','250');
    

    这样表与表之间就建立了联系方便查询,通过sqlyog软件,也可以看出来他们之间的联系

    在这里插入图片描述

    1.1内连接
    • 隐式内连接

      常用的条件查询语句就是隐式内连接如:

      select * from user where id = 1’

    • 显示内连接

      语法: 表名 INNER JOIN 表名 ON 条件

    • 需求:查询出每个用户所购买商品的订单信息

    -- 隐式内连接
    -- 添加条件查询  用户表与订单表之间的关系 u.`uid`=o.`user_id`; 
    SELECT u.*,o.* FROM `user` AS u,`orders` AS o WHERE u.`uid`=o.`user_id`; 
    -- 采用起别名的方式 可以减少代码
    -- 这条语句等同于以上语句
    SELECT`user`.`uid`,`user`.`username`,`orders`.`oid`,`orders`.`totalprice`,`orders`.`user_id` FROM `user` ,`orders` WHERE `user`.`uid`=`orders`.`user_id`;
    
    -- 显示内连接
    SELECT u.*,o.* FROM `user` AS u INNER JOIN `orders` AS o ON u.`uid`=o.`user_id`;
    
    1.2外连接
    • 左外连接

      语法:表名 LEFT OUTER JOIN 表名 ON 条件

    • 右外连接

      语法:表名 RIGHT OUTER JOIN 表名 ON 条件

    • 需求:查询出每个用户所购买商品的订单信息

    -- 左外连接
    SELECT `user`.*,`orders`.* FROM `user` LEFT OUTER JOIN `orders` ON `user`.`uid` = `orders`.`user_id`;
    -- left左边的数据都会展示出来,如果用户表中某个人没有下单也能查询出来这个人是谁
    SELECT `orders`.*,`user`.* FROM `orders` LEFT OUTER JOIN `user` ON `orders`.`user_id` = `user`.`uid`;
    
    
    -- 右外连接
    SELECT `user`.*,`orders`.* FROM `user` RIGHT OUTER JOIN `orders` ON `user`.`uid` = `orders`.`user_id`;
    -- right右边的表数据都会展示出来
    SELECT `orders`.*,`user`.* FROM `orders` RIGHT OUTER JOIN `user` ON `orders`.`user_id` = `user`.`uid`;
    
    
    1.3子查询

    子查询:相当于分布查询,第一次查询的结果可以看成一张临时表也可以也看成一个第二次查询时where的条件

    • 需求:查看用户为张三的订单详情
    -- 显示内连接 隐式内连接 左外连接 右外连接 都能查询 (不过外连接的特点就是会将其他用户的用户信息也查询出来,这点不太好,可以根据不同需求判断用什么连接)
    SELECT `user`.*,`orders`.* FROM `user` INNER JOIN `orders` ON `user`.`uid` = `orders`.`user_id` AND `user`.`username`='张三';
    -- 单表查询方法
    
    -- 第一步查询张三的id
    SELECT `user`.`uid` FROM `user` WHERE `user`.`username` = '张三';
    -- 第二步 建立关系:张三的id和订单表的user_id 一致
    SELECT `orders`.* FROM `orders` WHERE `orders`.`user_id` = 3; -- 这样查询出来看不见张三的信息了,但是我想让张三的用户表信息也展现出来除了以上几种方式还可以用子查询完成
    
    
    
    -- 子查询 把上面两步合二为一
    SELECT `orders`.* FROM `orders` WHERE `orders`.`user_id` = (SELECT `user`.`uid` FROM `user` WHERE `user`.`username` = '张三');
    -- 利用子查询拼接上用户表中张三的信息
    SELECT `user`.*, lsb.* FROM `user`,(SELECT `orders`.* FROM `orders` WHERE `orders`.`user_id` = (SELECT `user`.`uid` FROM `user` WHERE `user`.`username` = '张三'))
    AS lsb WHERE lsb.`user_id`=`user`.`uid`; -- 很显然用子查询不方便 技巧:将上一步中查询出来的用户张三的订单看成一张表然后起别名
    
    • 查询所有用户的所有订单以及订单中的商品信息

      -- 子查询
      -- 第一步由于订单表和商品表是多对多关系 所以引入一个中间表 
      -- 根据中间表和订单表、商品表示一对多关系所以可以查询出这两个表
      SELECT o.*,p.* FROM `orders` AS o,`middle` AS m,`product` AS p WHERE m.`orders_id`=o.`oid` AND m.`product_id`=p.`pid`; 
      -- 第二步把查询出来的表看出临时表 拼接用户表就可以了
      SELECT u.*,lsb.* FROM `user` AS u INNER JOIN (SELECT o.*,p.* FROM `orders` AS o,`middle` AS m,`product` AS p WHERE m.`orders_id`=o.`oid` AND m.`product_id`=p.`pid`
      ) AS lsb ON u.`uid` = lsb.`user_id`;
      
      -- 内连接
      SELECT u.*,o.*,m.*,p.* FROM `user` AS u,`orders` AS o,`middle` AS m,`product` AS p WHERE u.`uid`=o.`user_id` AND o.`oid`=m.`orders_id` AND m.`product_id`=p.`pid`;
      
    1.4 自查询

    自查询:就是把一张表通过起别名区分根据不同需求来查询

    • 案列:员工号7369 的 SMITH 他对应的老板编号是(MGR) 7902 而7902 又是员工FORD(7902) 那FORD 对应的老板编号又是 7566所以说 一个员工既是某几个员工的老板,他也有自己的老板,所以我要查询这个员工的所对应的老板 就可以使用自连接查询

    sql语句

    CREATE TABLE emp(
    	empno INT,
    	ename VARCHAR(50),
    	job VARCHAR(50),
    	mgr INT,
    	hiredate DATE,
    	sal DECIMAL(7,2),
    	comm DECIMAL(7,2),
    	deptno INT
    ) ;
    
    INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
    INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
    INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
    INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
    INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
    INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
    INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
    INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
    INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
    INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
    INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
    INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
    INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
    INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
    
    • 需求:我要查询emp表中 员工姓名 所对应的 上司姓名
    -- 自查询
    SELECT a.`ename`,a.`empno`,b.`ename`,b.`empno` FROM `emp` AS a,`emp` AS b WHERE a.`empno`=b.`mgr`;
    
    展开全文
  • MySQL数据库(五)

    2019-04-22 08:49:45
    应用场景:用户表和用户信息扩展表,商品表和商品详情表 如何建立关系:在从表中添加外键指向主表的主键 一对多 什么是一对多:有AB两张表,A表中一条数据对应B表中的多条数据,同时B表中一条数据对应A表的一条...

    表设计之关联关系

    一对一

    • 什么是一对一: 有AB两张表,A表中一条数据对应B表一条数据,同时B表一条也对应A表中的一条数据,这种关系称为一对一
    • 应用场景:用户表和用户信息扩展表,商品表和商品详情表
    • 如何建立关系:在从表中添加外键指向主表的主键

    一对多

    • 什么是一对多:有AB两张表,A表中一条数据对应B表中的多条数据,同时B表中一条数据对应A表的一条数据,称为一对多。
    • 场景: 员工表和部门表 商品表和商品分类表
    • 如何建立关系:在多的表中添加外键指向另外一张表的主键

    多对多

    • 什么是多对多: 有AB两张表,A表中一条数据对应B表中的多条数据,同时B表中的一条数据也对应A表中的多条数据,称为多对多
    • 场景:老师表和学生表
    • 如何建立关系,通过单独的关系表保存两张表的主键

    视图view

    • 什么是视图:数据库中表和视图都是其内部的对象,视图可以理解成一张虚拟的表,数据来自原表,视图本质其实就是取代了一段SQL查询语句
    • 为什么使用视图:视图可以起到SQL重用的作用,提高开发效率。可以隐藏敏感信息
    • 格式:
      create view 视图名 as (子查询)
    1. 创建一个10号部门的视图
      create view emp_10 as (select * from emp where deptno=10);
      create table emp_20 as (select * from emp where deptno=10);

    2. 创建一个没有工资的员工表
      create view v_emp_nosal as (select empno,ename,job,mgr,comm from emp);

    3. 创建一个显示每个部门平均工资、最高工资、最低工资、工资总和、部门人数的视图
      create view v_emp_info as (select deptno,avg(sal),max(sal),min(sal),sum(sal),count(*) from emp group by deptno);

    视图分类

    1. 简单视图:创建视图的子查询中不包含:去重、函数、分组、关联查询 的视图称为简单视图,可以对视图中的数据进行增删改查操作
    2. 复杂视图:和简单视图相反,只能对复杂视图中的数据进行查询操作

    对简单视图进行增删改操作

    1. 插入数据
      insert into emp_10 (empno,ename,deptno) values(10010,‘Tom’,10);
      insert into emp_10 (empno,ename,deptno) values(10011,‘Jerry’,20);
    • 数据污染:往视图中插入一条视图中不可见,但是在原表中可见的数据称为数据污染
    • 如果不希望出现数据污染可以使用with check option 解决
      create view v_emp_30 as (select * from emp where deptno=30) with check option;
      insert into v_emp_30 (empno,ename,deptno) values(10012,‘Lily’,30);//成功
      insert into v_emp_30 (empno,ename,deptno) values(10013,‘Lucy’,10);//失败 数据污染
    1. 修改和删除
    • 只能对视图中存在的数据进行操作
      delete from v_emp_30 where deptno=10; //不会有数据被删除
      delete from v_emp_30 where ename=‘Lily’; //删除成功
      update emp_10 set ename=‘abc’ where empno=10010;//修改成功
      update emp_10 set ename=‘abc’ where empno=10011;//修改失败 视图中不存在

    修改视图

    • 格式: create or replace view 视图名 as (子查询);
      create or replace view v_emp_30 as (select * from emp where deptno=30 and comm>0);

    删除视图

    • 格式: drop view 视图名;
      drop view v_emp_30;

    视图别名

    • 如果创建视图的子查询中使用了别名,那么对视图进行操作时只能使用别名
      create view v_emp_30 as (select ename name,deptno from emp where deptno=30);
      delete from v_emp_30 where ename=‘xxx’; //报错 不认识ename

    约束

    • 什么约束: 约束就是给表字段添加的限制条件

    非空约束 not null

    • 值不能为null
      create table t1(id int,age int not null);
      • 测试:
        insert into t1 values(1,20);//成功
        insert into t1 values(2,null); //失败

    唯一约束 unique

    • 值不能重复
      create table t2(id int,age int unique);
      • 测试
        insert into t2 values(1,20);//成功
        insert into t2 values(2,20);//失败

    默认约束 default

    • 设置默认值
      create table t3(id int,age int default 20);
      • 测试
        insert into t3 values(1,10);
        insert into t3 values(2,null);
        insert into t3 (id) values(2); //默认值生效

    主键约束 primary key

    • 唯一且非空

    外键约束

    • 外键:用来建立关系的字段称为外键
    • 外键约束:值可以为null,可以重复,但不能是关系表中不存在的数据,如果建立好关系后 被依赖的数据不能先删除,被依赖的表不能先删除
    • 如何使用:
      1. 创建部门表
        create table mydept(id int primary key auto_increment,name varchar(10));
      2. 创建员工表
        create table myemp(id int primary key auto_increment,name varchar(10),dept_id int,constraint fk_dept foreign key(dept_id) references mydept(id));
      • 格式介绍:
        constraint 约束名 foreign key(外键字段名) references 被依赖的表名(被依赖的字段名)
      • 插入数据
        insert into mydept values(null,‘神仙’),(null,‘妖怪’);
      • 测试:
        insert into myemp values(null,‘悟空’,1); //成功
        insert into myemp values(null,‘赛亚人’,3);//失败 不存在3
        delete from mydept where id=1; //失败 数据被依赖
        drop table mydept; //失败 表被依赖
        drop table myemp; //成功
        drop table mydept; //成功 没有被依赖
    • 外键约束工作中除非特定场景 一般使用外键的机会较少,因为添加外键后影响测试效率

    索引

    • 什么是索引:索引是数据库中提高查询效率的技术,类似字典中的目录

    • 为什么使用索引:如果不使用索引,查询数据时会挨个遍历每一个磁盘块查询数据,使用索引后,磁盘块会以树状结构保存,查询数据时能够大大的降低磁盘块的访问量,从而提高查询效率

    • 有索引一定好吗?
      不是,如果数据量小,使用索引反而会降低查询效率

    • 如何使用索引:

      1. 准备数据
        导入测试数据
        source d:/item_backup.sql
      2. 测试没有索引的情况下 查询速度
        select * from item2 where title=‘100’; //耗费1.06秒
    • 创建索引格式:
      create index 索引名 on 表名(字段(字段长度));

      1. 通过title字段创建索引
        create index i_item_title on item2(title);
      2. 再次测试查询速度
        select * from item2 where title=‘100’; //耗费0.02秒
    • 索引是越多越好吗?
      不是,因为索引会占用存储空间,只针对常用的查询字段创建索引

    • 如何查看索引
      show index from item2;

    • 索引分类:(了解)
      聚集索引: 给表添加主键约束后自动创建的索引,索引的树桩结构中保存着数据
      非聚集索引:通过非主键字段创建的索引,索引的树桩结构中没有数据保存的是主键值,通过非聚集索引找到主键值后还需要去聚集索引中查询具体数据

    • 删除索引
      drop index 索引名 on 表名;
      drop index i_item_title on item2;

    • 复合索引
      通过多个字段创建的索引
      create index i_item_title_price on item2(title,price);

    索引总结

    1. 索引是用来提高查询效率的技术,类似目录
    2. 因为索引会占用磁盘空间索引不是越多越好,只针对常用的查询字段创建索引
    3. 如果数据量小添加索引会降低查询效率,所以不是有索引就一定好

    事务

    • 数据库中执行同一业务多条SQL语句的工作单元,可以保证多条SQL全部执行成功或全部执行失败

    事务的ACID特性

    • ACID特性是保证事务正确执行的四大基本要素
    • Atomicity:原子性, 最小不可拆分,保证全部成功或全部失败
    • Consistency:一致性,从一个一致状态到另外一个一致状态
    • Isolation:隔离性,多个事务之间互不影响
    • Durability:持久性,当事务提交后持久保存到磁盘中

    事务的相关指令

    1. 开启事务 begin
    2. 提交事务 commit
    3. 回滚事务 rollback
    4. 保存回滚点 savepoint xxx;
    5. 回滚到某个回滚点 rollback to xxx;

    group_concat() 组连接

    查询每个部门的员工姓名和对应的工资,要求一个部门的信息显示到一行
    10 张三:3000 李四:4000
    20 王五:5000 赵六:6000

    select deptno,group_concat(ename,’-’,sal) from emp group by deptno;

    展开全文
  • 关联关系之设计 外键: 用来建立关系的字段称为外键 ...如何建立关系: 在从中添加外键,外键的值指向主的主键 练习:请设计保存以下数据 用户名:wukong 密码:123456 昵称:齐天大圣 电话:13...
  • 数据库部分(MySql)_3

    2019-10-03 00:39:31
     应用场景:用户表和用户扩展表,商品表和商品信息扩展表;  如何建立关系:在从表中添加一个外键字段指向主表的主键。  SELECT * FROM user u JOIN userinfo us ON u.id=us.uid WHERE u.name='Tom';  一对...
  • 数据库扩展性设计:使用二进制解决一条记录关联多个状态的问题 ...我们的数据库如何设计呢? 一般有几种方法 (1)建立关联 关联表字段:关系Id,商品Id,属性Id 查询:使用关联的方式,查询某属...
  • 《Visual C++ 数据库系统开发完全手册》(目录) 第一篇 Visual C++编程篇 第1章 Visual C++ 6.0开发环境概述 1.1 Visual C++ 6.0概述 1.2 熟悉Visual C++ 6.0的集成开发环境 1.2.1 进入Visual C++ 6.0环境 1.2.2 ...
  • 《Visual C++ 数据库系统开发完全手册》(目录) 第一篇 Visual C++编程篇 第1章 Visual C++ 6.0开发环境概述 1.1 Visual C++ 6.0概述 1.2 熟悉Visual C++ 6.0的集成开发环境 1.2.1 进入Visual C++ 6.0环境 1.2.2 ...
  • 复杂商品分类的表如何建立 http://www.iteye.com/topic/26987 亿级数据的高并发通用搜索引擎架构设计[原创] http://blog.s135.com/post/385/ 推荐[搜索引擎架构]的几篇文章 http://www.cnblogs.com/yjm...
  • 我们的数据库如何设计呢? 一般有几种方法 (1)建立关联表 关联表字段:关系Id,商品Id,属性Id 查询:使用关联表的方式,查询某属性的商品。 程序:写入时,写商品表和关联表; (2)将多个属性存在一个...
  • 如何让分类表category和商品表product之间产生关系? 如果有关系,在数据库如何表示这种关系? 我们首先建立数据表、插入数据: create table category( cid int primary key auto_increment, cname varchar(10)...
  • MySQL多之间的关系

    2020-06-21 10:09:57
    如上图所示,实际业务数据库中的表之间都是有关系的,我们接下来主要要学习的就是如何分析表关系 及建立表关系。 1.分类表 create table category( cid varchar(32) primary key, cname varchar(100) ); 2.商品...
  • 如上图所示,实际业务数据库中的之间都是有关系的,我们接下来主要要学习的就是如何分析关系及建立表关系。 1)分类 create table category( cid varchar(32) primary key, cname varchar(100) ); 2)...
  • 商品规格设计

    2019-03-09 09:18:03
    最近面试的时候遇到一个问题,大概意思是说商城一件衣服,颜色有蓝、白、黑,尺码有 S、M、L 码,不同的颜色和尺码搭配的价格和库存是不一样的,这种关系如何设计数据库呢? 示例图 之前也没用遇到过这种问题,第一...
  • ElasticSearch商城商品搜索实战

    千次阅读 2021-01-06 21:43:47
    在前面文章中主要是对ES的一个入门,那么在生产环境中结合业务ES到底是如何使用...建立好相关业务, 这里数据库以MySQL为例 ; 在数据操作的时候同时操作ES ; 1.环境准备 必需-安装ElasticSearch、 必需-ik分词器 注
  • 高性能高并发商品秒杀系统设计与优化 [目录] 项目简介 本项目主要是模拟应对大并发场景下,如何完成商品的秒杀,以及针对秒杀场景下为应对大并发进行的优化。 项目的技术结构如下图...参与秒杀的商品表: miaosha_good
  • 商品资料导入.xls

    2020-06-01 11:05:17
    Excel字段名即是Excel中的字段,您把“源字段名”和“Excel字段名”一一对应好,这样程序才能把信息导入到相应的数据库字段中,比如下图中的源字段[出库单]对应Excel字段[出库单];  注意,导入货品资料时,您的...
  • 作业14-数据库 1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容。...先建立一个购物车的,数据库建立三个,分别是用户信息,商城商品信息,购物车内商品信息。 商...
  • 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容。...建立一个存放商品信息的 截图: 2.2 系统中使用到了JDBC中什么关键类? 关键类: 1.DriverManager类 2.Connection接口 ...
  • 根据这个需求,可以分析出需要查询的主表为:查询主表:用户表查询关联表:订单表,订单明细表,items商品表。(由于商品和用户没有关系,通过订单和订单明细进行关联)这样的话,sql该如何去写?首先我们把SQL写出...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 136
精华内容 54
关键字:

数据库如何建立商品表