第一节 数据类型介绍与约束语句、数据库、表的建立(包含练习题)

一、数据库的安装

  基于MySQL语言的数据库操作,首先需要安装MySQL服务端,可以直接安装绿色版,我安装的是MySQL8.0。其次需要一个图形化工具来实现数据库的操作,可以使用navicat premium或者小海豚SQLyog.我使用的是navicate premium 12.0。接下来就认识一下什么是数据库吧!

二、 认识数据库

2.1 什么是数据库

  数据库就是存储数据,管理数据的仓库。
常见的数据库分为:

  • 关系型数据库:Oracle、MySQL、SQLServer、Access
  • 费关系型数据库:MongoDB、Redis、Solr、ElasticSearch、Hive、HBase

三、SQL语句

  结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于对关系数据库中的数据进行对应的增、删、改、查以及更新操作。

3.1 SQL分类

  • 数据定义语言DDL(Data Definition Language):主要用来定义逻辑结构,包括定义表,视图和索引。如:create table+表名,定义表。
  • 数据库操作语言DML(Data Manipulation Language):对数据库的增、删、改、查操作。如:insert、delete、updata、select。
  • 数据库控制语言DCL(Data Control Language):如:grant、deny、revoke等,只有管理员才有相应的权限。
  • DQL(Data Query Language)数据库查询语言,如: select 语法。

四、 数据类型

  数据类型决定了数据在计算机中的存储格式,常用的数据类型包括整数数据类型、浮点数据类型、精确小数类型、二进制数据类型、日期/时间数据类型、字符串数据类型。

4.1 整数、浮点数和小数数据类型

类型大小范围(有符号)范围(无符号)用途
TINYINT1Bytes(-128,1270,255)小数数值
SMALLINT2Bytes(-32 768,32 767)(0,65 535)大数数值
MEDIUMINT3Bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4Bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8Bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4Bytes单精度浮点数值
DOUBLE8Bytes双精度浮点数值
DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2小数值

4.2 日期和时间类型

  表示时间值的日期和时间类型为DATATIME、DATE、TIMESTAMP、TIME和YEAR。

类型大小范围格式用途
DATE31000-01-01——9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年分值
DATETIME81000-01-01 00:00:00
9999-12-31 23:59:59
YYYY-MM-DD
HH:MM:SS
混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038YYYYMMDDHHMMSS混合日期和时间值,时间戳

4.3 字符串类型

  字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT。

类型大小用途
CHAR0-255bytes定长字符串
VARCHAR0-65535bytes变长字符串
BLOB0-65535bytes二进制形式的长文本数据
TEXT0 - 65535bytes长文本数据

4.4 如何选择数据类型

  1. 整数和浮点数
      有小数部分采用浮点数类型保存数据;无小数部分采用整数类型保存数据。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入。例如:假设列的值的范围为1~99999,若使用整数,则 MEDIUMINT UNSIGNED是最好的类型;若需要存储小数,则使用FLOAT 类型。
    DOUBLE类型精度比FLOAT类型高,因此要求存储精度较高时应选择DOUBLE类型
  2. 浮点数和定点数
      浮点数FLOAT、DOUBLE相对于定点数DECIMAL的优势是:在长度一定的情况下,浮点数能表示更大的数据范围。由于浮点数容易产生误差,因此对精确度要求比较高时,建议使用DECIMAL来储,DECIMAL在MySQL中是以字符串存储的,用于定义货币等对精确度要求较高的数据。 在数据迁移中,float(M,D)是非标准SQL定义,数据库迁移可能会出现问题,最好不要这样使用。另外,两个浮点数进行减法和比较运算时也容易出问题,因此在进行计算的时候,一定要小心。进行数值比较时,最好使用DECIMAL类型。
  3. 日期与时间类型
      只需要记录年份,使用YEAR类型;
      只记录时间,则使用TIME类型;
      同时需要记录日期和时间,可以使用TIMESTAMP或者DATETIME类型。
      TIMESTAMP列的取值范围小于DATETIME的取值范围,存储范围较大的日期最好使用DATETIME。
      TIMESTAMP也有一个DATETIME不具备的属性。默认的情况下,当插入一条记录但并没有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。因此当需要插入记录的同时插入当前时间时,使TIMESTAMP是方便的。另外,TIMESTAMP在空间上比 DATETIME更有效。
  4. CHAR与VARCHAR之间的特点与选择
    区别:
      CHAR-固定字符长度,VARCAHR-可变长度字符
      CHAR自动补空格;VARCHAR不自动补
      CHAR是固定长度,所以它的处理速度比VARCHAR的速度要快,但是它的缺点是浪费存储空间,所以对存储不大但在速度上有要求的可以使用CHAR类型,反之可以使用VARCHAR类型来实现。

五、 数据库的操作

5.1 数据库的建立

  在进行数据库的操作之前,首先我们需要现拥有一个数据库。

/*1.创建数据库的执行语句是:
create database 数据库名;
*/
create database db1023;
//语句后面一定不能缺少 ; 

/*2.操作哪个数据库就需要在哪个数据库下进行
需要以下语句来进入数据库并对数据库下的内容进行操作
use 数据库名
*/
use db1023;

//3.想要查看是否已经建好数据库,以及使用以下语句来显示所有数据库
show databases;

/*4、查看数据库的定义  
show create database 数据库名;
*/
show create database db1023;

/*
数据库定义信息:
CREATE DATABASE `db1023` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */
*/

/*5.删除数据库,若指定的数据库不存在,则删除出错
drop database 数据库名
*/
drop database db1023;

3.查看数据库结果图:
在这里插入图片描述
4.查看数据库定义
在这里插入图片描述
注意:
  使用DROP DATABASE命令时要非常谨慎,在执行该命令时,MySQL 不会给出任何提醒确认信息。用DROP DATABASE声明删除数据库后,数据库中存储的所有数据表和数据也将一同被删除,而且不能恢复

5.2 创建数据表

  在创建完数据库且知道了对数据库的基本操作后,接下来就要创建数据表了。
  创建数据表就是在创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性过程,同时也是实时数据完整性(包括实体完整性、引用完整性和域完整性等)约束的过程。
  要对数据表进行操作就需要5.1中所提及的2.语句"use 数据库名;",指定在哪个数据库下进行操作,没有选择数据库,就会抛出“No database selected”的错误。

在这里插入图片描述创建表的语法规则如下

/*
create table 表名(
	字段1  类型  约束  默认值,
	字段2  类型  约束  默认值,
	字段3  类型  约束  默认值
);
*/
create table student(
	stu_id int,
	stu_name varchar(50),
	stu_sex char(3),
	stu_score float
);
create table employee(
	emp_id int primary key,
	emp_name varchar(50),
	emp_sex char(3) default '男',
	emp_salary float,
	emp_phone varchar(50) unique,
	emp_birth date,
	dept_id int
);

//使用该命令可以查看该数据库下的所有表
show tables;

使用create table 创建表时,必须指定以下信息
1.表的名称,不区分大小写,但不能用SQL语言中的关键字如:drop,insert
2.数据表中的每一列(字段)的名称和数据类型,创建多列需要用,隔开。约束可以在表创建好后再进而完善表的结构并添加

创建的表student、employee结构:
在这里插入图片描述

在这里插入图片描述查看所有表
在这里插入图片描述
  通过右键点击所创建的表,点击“设计表”可以查看表中的一些默认值,主键,非空等,这些就是我们接下来要讲到的表的约束。

5.3 表约束

  数据的完整性是指数据的可靠性和准确性。

  1. 实体完整性:实体的完整性强制表的标识符列或主键的完整性(通过索引,唯一约束,主键约束或标识列 属性)。
  2. 域完整性:限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过外键约束,检查约束,默认值定义,非空约束和规则)。
  3. 引用完整性:在删除和输入记录时,引用完整性保持表之间已定义的关系.引用完整性确保键值在所有表中一致.这样的一致辞性要求不能引用不存在的值.如果一个键值更改了,那么在整个数据库中,对该键值的引用要进行一致的更改。
  4. 自定义完整性:用户自己定义的业务规则。

四种完整性约束:
实体完整性:唯一约束、主键约束、标识列
域完完整性:限制数据类型、外键约束、默认值、非空约束
引用完整性:外键
自定义完整性:过程,触发器等

  约束是在表上强制执行的一些数据校验规则,被插入、修改或删除的数据必须符合在相关字段上设置的这些约束条件。

五类完整性约束:
    NOT NULL   非空
    UNIQUE   唯一
    PRIMARY KEY   主键
    FOREIGN KEY   外键
    CHECKED   检查(mysql不支持的)

5.3.1 主键约束

  主键,又称主码,是表中一列或多列的组合。主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空。主键能够唯一地表示表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度。主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。主键分为两种类型:单字段主键和多字段联合主键。

(1)单字段主键

主键由一个字段组成,SQL语句格式分为以下两种情况。

字段名 字段类型 primary key

 //例如:
create table employee2(
	emp_id int primary key auto_increment, -- 主键自增
	emp_name varchar(50),
	emp_sex char(3) default '男',
	emp_salary float,
	emp_phone varchar(50) unique,
	emp_birth date,
	dept_id int
);
  • 定义表之后指定主键

ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY(字段);
例如:
alter table employee add constraint pk_emp primary key (emp_id);-- 添加主键

(2)联合主键与主键自增

主键由多个字段联合组成,语法规则如下:

primary key(字段1,字段2,…字段n)
对应外键中的多对多关系例题练习!
在这里插入图片描述
通过上述代码,我们还看到有个自增,自增是什么?
  在数据库应用中,经常希望在每次插入新记录时,系统自动生成字段的 主键值。可以通过为表主键添加AUTO_INCREMENT关键字来实现。默认的,在MySQL中AUTO_INCREMENT的初始值是1,每新增一条记录,字段 值自动加1。一个表只能有一个字段使用AUTO_INCREMENT约束,且该字 段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数 类型(TINYINT、SMALLIN、INT、BIGINT等)。



思考:主键自增,如果使用完了怎么办?

(3)主键选取原则

  1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
  2. 主键应该是单列的,以便提高连接和筛选操作的效率。
  3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
  4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
  5. 主键应当有计算机自动生成
    我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的
    属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记
    录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助
    我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键
    构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。

5.3.2 非空约束

  非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空 约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。

 字段名 数据类型 not null

5.3.3 唯一约束

  唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。 唯一性约束的语法规则如下:

字段名 数据类型 UNIQUE

// 创建两个表 offices 和 empolyees
create table offices(
	officeCode int(10) primary key ,
	city varchar(50) not null,
	address varchar(50),
	country varchar(50) not null,
	postalCode varchar(15) unique
	//在建表时给postalCode添加唯一约束
);

如果定义完表后也可以给某个字段添加唯一约束,语法如下:

alter table 表名 add constraint 约束名 unique(约束字段);

//给上表中的postalCode添加唯一约束
alter table offices add constraint postalCode unique;

在这里插入图片描述

5.3.4 默认值约束

  默认约束(Default Constraint)指定某列的默认值。如男性同学较多, 性别就可以默认为‘男’。如果插入一条新的记录时没有为这个字段赋值,那么系统会自动为这个字段赋值为‘男’。 默认约束的语法规则如下:

字段名 字段类型 default 默认值

create table student(
	stu_id int,
	stu_name varchar(50),
	stu_sex char(3) default '男',
	stu_score float
);

在这里插入图片描述

5.3.5 查看表结构

  DESCRIBE/DESC语句可以查看表的字段信息,其中包括字段名、字段 数据类型、是否为主键、是否有默认值等。语法规则如下:

DESCRIBE 表名;
或者
DESC 表名;

//查看表
desc student;
show create table student;

在这里插入图片描述在这里插入图片描述

5.3.6 外键约束

  外键用来在两个表的数据之间建立连接,可以是一列或者多列。一个表 可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空 值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
  外键:首先它是表中的一个字段,虽可以不是本表的主键,但要对应另 外一个表的主键。外键的主要作用是保证数据引用的完整性,定义外键后, 不允许删除在另一个表中具有关联关系的行。外键的作用是保持数据的一致 性、完整性。例如,部门表tb_dept的主键是id,在员工表tb_emp5中有一个键deptId与这个id关联。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所 在的那个表即是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所 在的那个表即是从表。

语法:

alter table 表名 add constraint 外键名 foreign key(被添加的外键) references 所依赖的表名(所依赖的属性)
alter table idcard add constraint fk_idcard foreign key(idcard_id) references person(p_id);
在这里插入图片描述

//案例:一对一:人与身份证
use db1023;

create table person(
	p_id int primary key auto_increment,
	p_name varchar(50) not null,
	p_sex char(1) not null,
	p_phone varchar(15)
);

create table idcard(
	idcard_id int primary key,
	idcard_num varchar(50) not null,
	idcard_department varchar(50)not null,
	idcard_start date,
	idcard_end date
);
// 添加外键
// alter table 表名 add constraint 外键名 foreign key(被添加的外键) references 所依赖的表名(所依赖的属性)
alter table idcard add constraint fk_idcard foreign key(idcard_id) references person(p_id);

//一对多:部门与员工
create table department(
	departid int primary key auto_increment,
	departname varchar(50),
	departnum int default 0,
	departdesc varchar(200)
);

create table employee(
	empid int PRIMARY key auto_increment,
	empname varchar(50),
	empsex char(2) default '男',
	empbirth date,
	empphone varchar(50),
	deptid int 
);

alter table employee add constraint fk_emp_dept foreign key(empid) references  department(departid);

/*
多对多
账号   角色
N        N
有一个中间表
两个属性之间都为外键
双主键
*/
create table users(
	userid int primary key auto_increment,
	username varchar(50),
	userpassword varchar(50),
	userstatus int
);

create table roles(
	roleid int primary key auto_increment,
	rolename varchar(50) not null
);

create table userroles(
	uid int,
	rid int,
	primary key(uid,rid)
);

alter table userroles add constraint fk_ur_users foreign key(uid) references users(userid);
alter table userroles add constraint fk_ur_roles FOREIGN key(rid) references roles(roleid);


/*
自关联
*/

create table cities(
	id int primary key,
	name varchar(50) not null,
	pid int 
); 
//创建自关联
alter table cities add constraint fk_pid_id foreign key(pid) references cities(id);

一对一:
在这里插入图片描述一对多:
在这里插入图片描述多对多:
在这里插入图片描述
自关联:
在这里插入图片描述

5.3.7 修改表结构

  即在表存在的情况下,对表的属性进行修改。MySQL使用 ALTER TABLE语句修改表。常用的修改表的操作有修改表名、修改字段数 据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等。本节将对和修改表有关的操作进行讲解。
修改表名

ALTER TABLE <旧表名> RENAME [TO] <新表名>;
alter table employee rename to emp;

修改字段的数据类型

ALTER TABLE <表名> MODIFY <字段名> <数据类型>
alter table emp modify emp_name varchar(30);

修改字段名

ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
alter table emp change id dept_id int;

添加字段

ALTER TABLE <表名> ADD <新字段名> <新字段类型> <约束条件> [FIRST|AFTER 已存在字段名];
alter table emp add empaddr varchar(20);
alter table emp add empaddr varchar(20) after empsex;
alter table emp add empnum varchar(20) first;
alter table emp add stu_sex varchar(3) not null;

删除字段

ALTER TABLE <表名> DROP <字段名> ;
alter table emp drop stu_sex;

修改字段的排序位置

ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST|AFTER <字段2>;
alter table student modify stu_id int after stu_name;

删除表的外键约束

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
alter table emp drop foreign key fk_emp_dept;

更改表的存储引擎

ALTER TABLE <表名> ENGINE=<更改后的存储引擎名>;
alter table tb_department engine = MyISAM;

删除数据表

drop table [if exists]表1,表2,表n;
drop table student;

六、 练习

6.1 练习一

1.创建数据库company,在库中创建两个表offices和employees表

offices表结构:
在这里插入图片描述
employees表结构:
在这里插入图片描述
2. 查看该库下几个表以及查看两张表结构。
3. 将表employees的mobile字段修改到officeCode字段后面。
4. 将表employees的birth字段改名为employee_birth。
5. 修改sex字段,数据类型为CHAR(1),非空约束。
6. 删除字段note。
7. 增加字段名favoriate_activity,数据类型为VARCHAR(100)。
8. 删除表offices。
9. 将表employees名称修改为employees_info。

//1.创建表
use  exercise;
create table offices(
	officeCode int(10) PRIMARY key UNIQUE,
	coty VARCHAR(50) not null,
	address VARCHAR(50),
	country VARCHAR(50) not null,
	postalCode VARCHAR(15) UNIQUE
);

create table employees(
	employeeNumber int(11) PRIMARY KEY UNIQUE auto_increment,
	lastName VARCHAR(50) not null,
	firstName VARCHAR(50) not null,
	mobile VARCHAR(25) UNIQUE,
	officeCode int(10) not null,
	jobTitle VARCHAR(50) not null,
	birth datetime not null,
	note VARCHAR(25),
	sex VARCHAR(5) 
);

/* 添加外键
 alter table 表名 add constraint 外键名 foreign key(被添加的外键) references 所依赖的表名(所依赖的属性)
*/

ALTER TABLE employees add CONSTRAINT fk_officeCode FOREIGN KEY(officeCode) REFERENCES offices(officeCode);

//3.更改字段顺序到某一个后边
alter table employees modify mobile varchar(25) after officeCode;

//4.更改字段名
alter table employees change birth employee_birth datetime;

//5.更改字段数据类型
alter table employees modify  sex char(1) not null; 

//6.删除字段
alter table employees drop note;

//7.添加字段
alter table employees add favourite_activity VARCHAR(100);

//ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
//8.删除外键约束并删除表
alter table employees drop FOREIGN KEY fk_officeCode;
drop table offices;

//9.更改表名字
alter table employees RENAME TO employees_info;

2.查看表和表结构
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.2 练习二

创建数据库Market,在Market中创建数据表customers

在这里插入图片描述

  1. 创建数据表customers,在c_num字段上添加主键约束和自增约 束,在c_birth字段上添加非空约
    束。
  2. 将c_contact字段插入c_birth字段后面。
  3. 将c_name字段数据类型改为VARCHAR(70)。
  4. 将c_contact字段改名为c_phone。
  5. 增加c_gender字段,数据类型为CHAR(1)。
  6. 将表名修改为customers_info。
  7. 删除字段c_city
  8. 修改数据表的存储引擎为MyISAM。
  9. 在Market中创建数据表orders。
    在这里插入图片描述
  10. 创建数据表orders,在o_num字段上添加主键约束和自增约束,在 c_id字段上添加外键约束,关联customers表中的主键c_num。
  11. 删除orders表的外键约束,然后删除表customers。

create database Market;

//1.创建表
use Market;
create table customers(
	c_num INT(11) PRIMARY KEY not NULL UNIQUE auto_increment,
	c_name VARCHAR(50),
	c_contact VARCHAR(50) ,
	c_city VARCHAR(50) ,
	c_birth datetime not NULL
);

//修改字段顺序
alter table customers MODIFY c_contact VARCHAR(50) after c_birth;

//修改字段类型
alter table customers MODIFY c_name VARCHAR(70);

//修改字段名字
alter table customers CHANGE c_contact  c_phone VARCHAR(50);

//添加字段
alter table customers add c_gender CHAR(1);

//修改数据库名字
alter table customers RENAME TO customers_info;

//删除字段
alter table customers_info drop c_city;

//修改数据库引擎
-- ALTER TABLE <表名> ENGINE=<更改后的存储引擎名>;
alter table customers_info ENGINE = MyISAM;

//新建表
create table orders(
	o_num INT(11) ,
	o_date date,
	c_id INT(11) 
);

//添加主键
alter table orders ADD CONSTRAINT pk_num PRIMARY KEY(o_num) ;

//修改主键字段属性
alter table orders CHANGE o_num o_num int(11) auto_increment;

//添加外键
ALTER TABLE customers_info ENGINE = INNODB;
alter TABLE orders ADD CONSTRAINT fk_id FOREIGN KEY(c_id) REFERENCES customers_info(c_num);

//删除外键
alter table orders drop FOREIGN KEY fk_id;

//删除表
DROP TABLE customers_info;

6.3 练习三

1.创建数据库MySchool
2. 创建以下数据表
  班级表:Grade表
在这里插入图片描述

&emsp;&emsp;学生表: Student表

在这里插入图片描述

  科目表:Subjects表

在这里插入图片描述

  成绩表:Result表

在这里插入图片描述

  表关系:

在这里插入图片描述

create DATABASE MySchool;
use MySchool;

CREATE TABLE Grade(
	GradeId INT PRIMARY KEY,
	GradeName VARCHAR(50) not null
);

CREATE TABLE Student(
	StudentNo VARCHAR(50) PRIMARY KEY,
	LoginPwd VARCHAR(50),
	STudentName VARCHAR(50),
	Sex CHAR(2),
	GradeId int,
	Phone VARCHAR(255),
	Address VARCHAR(255),
	BornDate datetime,
	Email VARCHAR(50)

);

CREATE TABLE Subjects(
	SubjectId INT PRIMARY KEY,
	SubjectName VARCHAR(20) NOT NULL,
	ClassHour INT NOT NULL,
	GradeId INT NOT NULL
);

CREATE TABLE Result(
	Id int PRIMARY KEY auto_increment,
	StudentNo VARCHAR(50) NOT NULL,
	SubjectId INT NOT NULL,
	StudentResult int ,
	ExamDate datetime NOT NULL

);

ALTER TABLE Subjects ADD CONSTRAINT fk_subject_grade FOREIGN KEY(GradeId) REFERENCES Grade(GradeId);

ALTER TABLE Student ADD CONSTRAINT fk_student_grade FOREIGN KEY(GradeId) REFERENCES Grade(GradeId);

ALTER TABLE Result ADD CONSTRAINT fk_result_student FOREIGN KEY(StudentNo) REFERENCES Student(StudentNo);

ALTER TABLE Result ADD CONSTRAINT fk_result_subject FOREIGN KEY(SubjectId) REFERENCES Subjects(SubjectId);

6.4 通过上述习题,我们可以发现:

1.在mysql中,建立外键关联,关联表必须是使用innodb,不然会报错类似于这样:Failed to open the referenced table ‘customers_info’,将数据库引擎更改为innodb即可
2.主键自增,要么在创建表示就添加上,不然就在表创建后使用修改字段属性方式去添加。而且主键自增得在字段被设置为主键时才能设置。
3.添加外键时要自己给外键起名字一般都起名为fk_被添加外键的表表名_关联的表表名,这要比较好找是哪两张表之间的关系。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值