精华内容
下载资源
问答
  • 当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。 为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢? 因为,并不是所有的表都有ID这个字段,比如,我们建一个学生表,没有...

    复合主键

    指的就是一张表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。

    在一张数据表中:“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。

     

    为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢?

    因为,并不是所有的表都要有ID这个字段,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生的名字、年龄、班级都可能重复,无法使用单个字段来唯一标识,这时,我们可以将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复

     

    联合主键:

    就是多个主键联合形成一个主键组合。

    比如 :
    主键A跟主键B组成联合主键
    主键A跟主键B的数据可以完全相同(……),联合就在于主键A跟主键B形成的联合主键是唯一的
    下例主键A数据是1,主键B数据也是1,联合主键其实是11,这个11是唯一值,绝对不充许再出现11这个唯一值。(这就是多对多关系)
    主键A数据 主键B数据
    1      1
    2      2
    3      3
    主键A与主键B的联合主键值最多也就是
    11
    12
    13
    21
    22
    23
    31
    32
    33

     

    转载于:https://www.cnblogs.com/zhengyeye/p/10087042.html

    展开全文
  • 设计数据库表的时候,要为每个表设置个主键;2. 主键最好是跟业务无关的; 3. 最好是自增的; 于是,很新入行的程序猿们把这些前辈们的教条拿来就用,每个表的开头都会有个ID字段,并且在自增那里再打上个“勾...

    我们在开发的时候经常会听到这样的建议:1. 设计数据库表的时候,要为每个表设置一个主键;2. 主键最好是跟业务无关的; 3. 最好是自增的;
    于是,很多新入行的程序猿们把这些前辈们的教条拿来就用,每个表的开头都会有个ID字段,并且在自增那里再打上个“勾勾”。OK,万事大吉,开始Coding。这个习惯有不少人甚至是保持了好多年,却从来没思考过对与不对,更不说为什么了。今天,我们来一起简单地分析一下原因,希望起到抛砖引玉的作用,引起大家进一步深入研究的兴趣。
    主键主要作用:数据完整性;让相邻键值的数据紧凑地存放在一起;加快访问速度等。
    为什么建议业务无关:避免因业务变更导致应用需要进行各种大量的修改,进而对系统的安全、稳定性进行冲击;
    为什么一定自增:其实这才是本次分享里最想提的内容。自增保证了每一条新数据的值都是比当前最大值大的,所以新生成的记录会被写入数据页的末端。而末端的好处就是避免了各种复杂的寻址过程,也降低了索引分裂的成本。【可拓展阅读索引分裂相关内容】
    在数据库服务中,一般情况下对每一行数据(准确的说是每一个数据块,实际上数据库从来都不是按行而是按页/数据块读取数据)的修改是从磁盘读到缓存(内存),在缓存中修改完成后又刷回磁盘的过程。(【数据库高速缓存—〉磁盘缓存—〉从磁盘读取】 从左到右成本逐步上升)
    如果我们的主键是随机的,且有大有小,如果正好新生成的主键比当前最大值要小,数据库就需要先去高速缓存中查找是否已存在新数据需要写入的数据块,如果没有,则需要去磁盘上将该数据块读回缓存,导致增加了磁盘的随机IO(对于数据库性能来说降低磁盘IO非常重要);而频繁的数据页分裂,也导致数据变得不再紧凑,产生大量碎片。
    看到这里,大家应该也可以看到。“自增型主键”其实不是一个结果,而是一个解决问题的方式而已,看到问题的本质,其实就算不用自增型,其他方式也一样可以达到同样的效果,不是吗?
    凡事都是有利有弊,关键在于你该怎么去平衡、去取舍。那么自增型的主键又存在什么样的弊端呢?因为新数据都是写在末端,那么在高并发写入的情况下,将会产生“热点块”,对“热点块”的读写产生强烈的资源竞争。所以,同样会引起另外一个方面的性能问题。至于解决方法?其实也没有唯一的标准答案,大家都尝试一下吧(o^^o)

    展开全文
  • )1、表约束①主键约束 (primary key):主键可以由一个字段或多个字段构成,但是设置为主键的字段在表中通常是唯一的值,并且不能随便修改也不能空。②唯一约束(unique) :该列的值是惟一的,且可以空③检查约束 ...
    70fc826d7dc278ee79ed3bac72a34496.png

    一、创建表

    (先简单说一下什么是表,表是一种结构化的文件,可以用来存储特定类型的数据。另外,在一个数据库中,表的名称是唯一的,不能重复。)

    1、表约束

    ①主键约束 (primary key):主键可以由一个字段或多个字段构成,但是设置为主键的字段在表中通常是唯一的值,并且不能随便修改也不能为空。

    ②唯一约束(unique) :该列的值是惟一的,且可以为空

    ③检查约束 (check): 规定该列的取值范围,格式限制等,比如年龄的取值范围,邮件的格式等等

    ④默认约束(default): 设置该列的默认值

    ⑤外键约束(foreign key) :用于两个表之间建立关系,需要规定引用主表的那列,定义外键的那张表称之为子表,另一张表称之为主表,在表的创建过程中,应该先创建主表,后创建子表。

    2、创建表

    说完了表约束,万事俱备,只欠一张表了。

    语法格式:

    create table 表名( 列名称 类型 约束, 列名称 类型 约束, ......... ) ¨G0G create table Student( studentid int primary key, --主键 name varchar(20) not null, --不能为空 age int check(age between 1 and 120), --检查约束(年龄在1-120之间) gender varchar(2) check(gender='男' or gender='女'), --检查约束 address varchar(50) default 青岛市, --默认约束 idcard char(18) unique, --唯一约束 classid int foreign key references Class(classid) --外键约束 ) ¨G1G 主键: alter table 表名 add constraint PK_字段名 primary key (字段名) 唯一: alter table 表名 add constraint UQ_字段名 unique (字段名) 检查: alter table 表名 add constraint CK_字段名 check (条件表达式) 默认: alter table 表名 add constraint DF_字段名 default '默认值' for 字段名 外键: alter table 表名 add constraint FK_字段名 foreign key(字段名) references 关联的表名(关联的字段名) ¨G2G alter table 表名 drop constraint 约束名(约束名就是在前面创建的,如 “PK_字段”)

    注:如果约束是在创建表时创建的,则不能用这种命令删除,只能在企业管理器里面删除

    3、添加、修改字段

    添加字段:

    Alter table [表名] add [列名] 类型

    修改字段类型:

    Alter table [表名] alter column [列名] 类型

    二、临时表和表变量

    1、先说说如何声明和插入数据

    表变量:

    声明:DECLARE @tb_table TABLE(................)插入:insert into @tb_table select name from Student

    临时表:

    声明:create table #tb_table ((................)插入:insert into #tb_table select name from Student

    2、区别

    平时用的最多的地方就是在存储过程里,简单说一下他俩的区别。临时表是利用了硬盘(tempdb数据库) ,表变量是占用内存,因此小数据量当然是内存中的表变量更快。当大数据量时,就不能用表变量了,太耗内存了。大数据量时适合用临时表。表变量在执行完批处理语句后就会自动清理,而临时表需要手动删除。

    三、多表连接查询

    前面既然提到了外键约束,那我们就来说说如何查询多张存在关联的表

    1、内连接(inner join)

    先直接上sql语句吧:

    select a.name,a.age,b.classname from Student a inner join Class b on a.classid=b.classid where studentid=0001

    这是关联学生和班级表,查询出学号为0001的学生的姓名、年龄、班级。这两张表是通过classid这个字段关联的,所以用a和b来区分这两张表(a,b相当于一个代号),在select后查询的字段最好是加上这个代号,因为如果查询的字段在两张表中都存在时,它无法区分你查的是哪张表里的,所以会报错。

    2.外链接

    它所连接的两张表是主表与次表的关系,主表的数据,必须全部显示,次表的数据,只在与主表中的数据有关联的才能显示。

    ①左外链接:左边的表是主表,必须全部显示,右边的表是次表,关联上才可以显示。

    select a.name,a.age,b.classname from Student a left outer join Class b on a.classid=b.classid where studentid=0001

    ①右外链接:右边的表是主表,必须全部显示,左边的表是次表,关联上才可以显示。

    select a.name,a.age,b.classname from Student a right outer join Class b on a.classid=b.classid where studentid=0001

    ③完全外链接:两张表都是主表,不管是否关联上,都要显示

    select a.name,a.age,b.classname from Student a full outer join Class b on a.classid=b.classid where studentid=0001
    展开全文
  • 1. 普通字段类型 2. 主键映射 单列主键映射 列作为主键映射   主键生成策略,查看api: ...为什么要设置主键数据库存储的数据都是有效的,必须保持唯一。   (为什么把id作为主键?) 因为表中通常找不到合适的列

    1. 普通字段类型

    2. 主键映射

    单列主键映射

    多列作为主键映射

     

    主键生成策略,查看api:   5.1.2.2.1. Various additional generators

     

     

    数据库:

    一个表能否有多个主键?   不能。

    为什么要设置主键?       数据库存储的数据都是有效的,必须保持唯一。

     

    (为什么把id作为主键?)

    因为表中通常找不到合适的列作为唯一列即主键,所以为了方法用id列,因为id是数据库系统维护可以保证唯一,所以就把这列作为主键!

    注意:主键自增时,id的初始值不能为0

     

    联合/复合主键

    如果找不到合适的列作为主键,出来用id列以外,我们一般用联合主键,即多列的值作为一个主键,从而确保记录的唯一性。


    映射文件介绍:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
    	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    
    <!-- 映射文件: 映射一个实体类对象;  描述一个对象最终实现可以直接保存对象数据到数据库中。  -->
    <!-- 
    	package: 要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)
    	auto-import 默认为true, 在写hql的时候自动导入包名
    				如果指定为false, 再写hql的时候必须要写上类的全名;
    				  如:session.createQuery("from cn.itcast.c_hbm_config.Employee").list();
     -->
    <hibernate-mapping package="cn.itcast.c_hbm_config" auto-import="true">
    	
    	<!-- 
    		class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)
    			name 指定要映射的对象的类型
    			table 指定对象对应的表;
    				  如果没有指定表名,默认与对象名称一样 
    	 -->
    	<class name="Employee" table="employee">
    		
    		<!-- 主键 ,映射-->
    		<id name="empId" column="id">
    			<!-- 
    				主键的生成策略
    					identity  自增长(mysql,db2)
    					sequence  自增长(序列), oracle中自增长是以序列方法实现
    					native  自增长【会根据底层数据库自增长的方式选择identity或sequence】
    							如果是mysql数据库, 采用的自增长方式是identity
    							如果是oracle数据库, 使用sequence序列的方式实现自增长
    					
    					increment  自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)
    					
    					assigned  指定主键生成策略为手动指定主键的值
    					uuid      指定uuid随机生成的唯一的值
    					foreign   (外键的方式, one-to-one讲)
    			 -->
    			<generator class="uuid"/>
    		</id>
    		
    		<!-- 
    			普通字段映射
    			property
    				name  指定对象的属性名称
    				column 指定对象属性对应的表的字段名称,如果不写默认与对象属性一致。
    				length 指定字符的长度, 默认为255
    				type   指定映射表的字段的类型,如果不指定会匹配属性的类型
    					java类型:     必须写全名
    					hibernate类型:  直接写类型,都是小写
    		-->
    		<property name="empName" column="empName" type="java.lang.String" length="20"></property>
    <property name="workDate" type="java.util.Date"></property>
    		<!-- 如果列名称为数据库关键字,需要用反引号或改列名。 -->
    		<property name="desc" column="`desc`" type="java.lang.String"></property>
    		
    	</class>
    	
    
    </hibernate-mapping>




    复合主键映射

    这里建立userName和address为符合主键,注意:符合主键要单独封装。(因为配置映射文件时,复合主键需要传入的是一个类对象)

    第一步:建立一个复合主键类:CompositeKeys

    // 复合主键类
    public class CompositeKeys implements Serializable{
    	private String userName;
    	private String address;
       // .. get/set (封装方法省略)
    }


    第二步:建立一个实体类 User

    public class User {
    
    	// 名字跟地址,不会重复
    	private CompositeKeys keys;
    	private int age;
    }

    配置实体类的映射文件  User.hbm.xml

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
    	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="cn.itcast.d_compositeKey" auto-import="true">
    	
    	<class name="User">
    		
    		<!-- 复合主键映射 -->
    		<composite-id name="keys">
    			<key-property name="userName" type="string"></key-property>
    			<key-property name="address" type="string"></key-property>
    		</composite-id>
    		
    		<property name="age" type="int"></property>
    </class>
    </hibernate-mapping>


    第三步建立一个测试类 App.java

    public class App2 {
    	
    	private static SessionFactory sf;
    	static  {		
    		// 创建sf对象
    		sf = new Configuration()
    			.configure()
    			.addClass(User.class)  //(测试) 会自动加载映射文件:Employee.hbm.xml
    			.buildSessionFactory();
    	}
    
    	//1. 保存对象
    	@Test
    	public void testSave() throws Exception {
    		Session session = sf.openSession();
    		Transaction tx = session.beginTransaction();
    		
    		// 对象
    		CompositeKeys keys = new CompositeKeys();
    		keys.setAddress("广州棠东");
    		keys.setUserName("Jack");
    		User user = new User();
    		user.setAge(20);
    		user.setKeys(keys);
    		
    		// 保存
    		session.save(user);
    		
    		
    		tx.commit();
    		session.close();
    	}
    	
    	@Test
    	public void testGet() throws Exception {
    		Session session = sf.openSession();
    Transaction tx = session.beginTransaction();
    		
    		//构建主键再查询
    		CompositeKeys keys = new CompositeKeys();
    		keys.setAddress("广州棠东");
    		keys.setUserName("Jack");
    		
    		// 主键查询
    		User user = (User) session.get(User.class, keys);
    		// 测试输出
    		if (user != null){
    			System.out.println(user.getKeys().getUserName());
    			System.out.println(user.getKeys().getAddress());
    			System.out.println(user.getAge());
    		}
    		
    		
    		tx.commit();
    		session.close();
    	}
    }






    展开全文
  • 1. 数据完整性 1.1 什么是数据的完整性? ​ 在创建表时给表中添加约束,用来保证存放到数据库中的数据是有效的,即...每个表中有一个主键,其作用使数据唯一,且不能null。 使用DDL,创建表中字段的时候直接
  • mysql数据库基础

    2017-01-05 15:17:15
    一个表不能有多个主键? 解释:不能,一个表中有且只能有一个主键,大事两列(字段)可以作为一个主键 ...为什么要设置主键? 数据库存储的数据都是有效的,必须保持唯一。 为什么把id作为主键
  • 数据库资料

    2018-04-01 22:00:33
    主要包含最基础的数据库语句,很适合初学者,目标使用企业管理器创建数据库设置表的主键、外键和建立表之间的关系表增加约束数据完整性 数据完整性 数据存放在表中 “数据完整性的问题大多是由于设计引起的” ...
  • 一,概述 ...为什么要设置主键? 不能;数据库存储的数据都是有效的,必须保持每张表的每条记录唯一! 2)为什么通常喜欢将id设置为主键? 因为表中通常找不到合适的列作为作为唯一列即主键,所以为了标识方
  • 数据库为什么要设置主键及其作用: 数据库主键,指的是一列或列的组合,其值能唯一的标识表中的每一行,通过它可强制表的实体完整性。 主键可以用来表示一精确定位的特定的行,如果没有主键,你就无法精准...
  • MySQL数据库(日结)

    2017-04-26 00:51:11
    1、为什么进行数据库备份? 数据库故障 突然断电 病毒入侵 误操作导致数据丢失 2、索引有: 主键索引:唯一性;非空;只能存在一个。 唯一索引:唯一性;允许为空;可以存在多个。 常规索引 全文索引:...
  • 比方说数据库id没有设置主键,那么重复的id数据就算是冗余数据。 比方说规定id和code组合不能重复,那么id和code组合重复了就是冗余数据。 数据冗不冗余看你的规定。 然后删除冗余数据就要找到冗余的规则 我这里的...
  • 4.1 为什么要规范化 98 4.1.1 消灭重复数据 98 4.1.2 避免编写不必要的代码 98 4.1.3 给表瘦身 98 4.1.4 最大化聚集索引的使用 99 4.1.5 降低每张表中索引的数量 99 4.2 规范化应该走远 99 4.3 规范化过程...
  • 4.1 为什么要规范化 98 4.1.1 消灭重复数据 98 4.1.2 避免编写不必要的代码 98 4.1.3 给表瘦身 98 4.1.4 最大化聚集索引的使用 99 4.1.5 降低每张表中索引的数量 99 4.2 规范化应该走远 99 4.3 规范化过程...
  • SQL Server 2008数据库设计与实现

    热门讨论 2012-02-28 18:55:34
     4.1 为什么要规范化  4.1.1 消灭重复数据  4.1.2 避免编写不必要的代码  4.1.3 给表瘦身  4.1.4 最大化聚集索引的使用  4.1.5 降低每张表中索引的数量  4.2 规范化应该走远  4.3 规范化过程  ...
  •  本书针对大多数日常的oracle database 11g数据库管理任务,全面覆盖dba行业知识,并将理论与实践相结合,旨在初中级dba提供高效运行数据库所需的方方面面的知识,帮助他们从oracle公司发行的大量资料中找到自己...
  • 数据库课程设计(基于B/S)

    热门讨论 2008-12-28 15:28:06
    (6)系统维护功能:数据的安全管理,主要是依靠管理员对数据库里的信息进行备份和恢复,数据库备份后,如果出了什么意外可以恢复数据库到当时备份的状态,这提高了系统和数据的安全性,有利于系统的维护。...
  • 在应用程序中一张基础配置信息表,保存着一些...第一,设置该字典表的键字段唯一约束;第二,启用审计功能,找出是什么应用程序插入了相同名称的记录。 前者治标,后者治本, 我们既治标,又治本。因此,...
  • MySQL为什么要使用双主架构?MySQL最常见的集群架构,是一主从,主从同步,读写分离的架构。通过这种方式,能够扩充数据库的读性能,保证读库的高可用,但此时写库仍然是单点。为了保证MySQL写库的高可用,可以在...
  • 公司里做的项目, 打算用多个web服务器, 共同连一个DB, 在某个基础表里的数据需要逻辑唯一, 既某对象(attr1="a", attr2="b")在数据库里只能存在一条记录, 由于这个基础表在用户使用中是用户自定义的, 因此有可能a,b2...
  • 【Hibernate】映射配置

    千次阅读 2017-05-19 11:34:59
    一、映射配置 1. 普通字段类型 2. 主键映射 单列主键映射 列作为主键映射   主键生成策略,查看api: 5.1.2.2.1....为什么要设置主键数据库存储的数据都是有效的,必须保持唯一。   (为什么把id作为主键?) 因为
  • (2):为什么要设置主键数据库存储的数据都是有效的,必须保持唯一性;(3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即主键,所有为了方便用id列,因为id是数据库系统维护可以保证唯一,所以就把这...
  •  (2):为什么要设置主键数据库存储的数据都是有效的,必须保持唯一性;  (3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即主键,所有为了方便用id列,因为id是数据库系统维护可以保证唯一,...
  • 1. 普通字段类型 2. 主键映射  单列主键映射  多列作为主键映射   主键生成策略,查看api: 5.1.2.2.1....数据库: ... 一个表能否有多个主键?... 为什么要设置主键? 数据库存储的数据都是有效的,必须保持
  • 由于name在表里不是主键所以就用property标签 name属性里的值就是写user对象里面的属性这属性数据库中的字段对应, column属性就是设置数据库中对应的字段 ,not-null就是非空约束--> <!-- 对一 class...

空空如也

空空如也

1 2 3 4 5
收藏数 97
精华内容 38
关键字:

数据库为什么要设置多个主键