数据库概念之MySQL

主码与外码

主码和外码是用来实现参照完整性的,外码的数据项需参照主码的数据项来操作。具体实现是在创建数据库时为表间创立关系。如:
三个关系:
学生信息表(学号、姓名、性别、出生年月、籍贯、所属学院) //学号 是主键(主码
课程表(课程号,课程名称,学分) //课程号 是主键(主码
成绩表(学号,课程号,成绩) //学号 是外码;课程号 是外码
“成绩表”(从表)的学号参照“学生信息表”(主表)的学号来录入。1、也就是主表里面没有的学号,从表里面不能有,外码参照主码录入;2、级联操作,即当删除、修改某个主表里面的学号时,从表里面的那个学号会相应的自动删除、修改。外码参照主码操作。

主码与候选码

主码和候选码都是用来唯一标识关系的。
一个关系中可以有多个候选码,只需选其中之一作为主码,主码里包含的属性叫做主属性。
举个例子
学生表中:
属性:学号、姓名、性别、年龄、班级、系
一般学号就可以唯一的标识出一个同学的身份,可以设置学号为主码。是最简单的候选码。
那么 学号+姓名当然也可以作为唯一标识,也可以用来作为候选码
同理,学号+姓名+性别也可以作为候选码
以此类推
最极端的情况是全表都用来做主码,这时的主码也叫全码。
所选择的候选码中包含的属所有性叫做主属性,其他属性成为非主属性。例如,当设置学生+姓名作为主码时,主属性就是学号和姓名,性别、年龄、班级、系是非主属性

举例

//例如:  声明dept_name 作为表department的primary key 
	create table instructor (             
	                ID            char(5),                   
	                name          varchar(20) not null,        
	                dept_name     varchar(20),                 
	                salary        numeric(8,2),              
	                primary key (ID),                          
	                foreign key (dept_name) references departmen)
//primary key 在声明的过程中自动设置为not null
	create table student (        
					ID            varchar(5),        
					name          varchar(20) not null,        
					dept_name     varchar(20),        
					tot_cred      numeric(3,0),        
					primary key (ID),
			   	    foreign key (dept_name) references department) );

	create table takes (        
					ID            varchar(5),        
					course_id     varchar(8),        
					sec_id        varchar(8),        
					semester      varchar(6),        
					year          numeric(4,0),        
					grade         varchar(2),        
					primary key (ID, course_id, sec_id, semester, year),        
					foreign key (ID) references  student        				foreign key (course_id, sec_id, semester, year) references section );
//注意: 可以从以上表的主码中删除sec_id , 以保证一个学生无法在同一学期注册一门课的两个部分
	create table course (       
		 			course_id     varchar(8) primary key,        		
		 			title         varchar(50),
		         	dept_name     varchar(20),  
		            credits       numeric(2,0),  
		            foreign key (dept_name) references department) );
//主码可以在声明属性时一起声明