数据库概念之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) );
//主码可以在声明属性时一起声明