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

一、数据库的安装 ??基于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 整数、浮点数和小数数据类型
类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1Bytes (-128,127 0,255) 小数数值
SMALLINT 2Bytes (-32 768,32 767) (0,65 535) 大数数值
MEDIUMINT 3Bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4Bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8Bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4Bytes 单精度浮点数值
DOUBLE 8Bytes 双精度浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 小数值
4.2 日期和时间类型 ??表示时间值的日期和时间类型为DATATIME、DATE、TIMESTAMP、TIME和YEAR。
类型 大小 范围 格式 用途
DATE 3 1000-01-01——9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年分值
DATETIME 8 1000-01-01 00:00:00
9999-12-31 23:59:59
YYYY-MM-DD
HH:MM:SS
混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038 YYYYMMDDHHMMSS 混合日期和时间值,时间戳
4.3 字符串类型 ??字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT。
类型 大小 用途
CHAR 0-255bytes 定长字符串
VARCHAR 0-65535bytes 变长字符串
BLOB 0-65535bytes 二进制形式的长文本数据
TEXT 0 - 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) referencesdepartment(departid); /* 多对多 账号角色 NN 有一个中间表 两个属性之间都为外键 双主键 */ 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.创建表 useexercise; 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 modifysex 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_contactc_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表
数据库|第一节 数据类型介绍与约束语句、数据库、表的建立(包含练习题)
文章图片

    学生表: 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_被添加外键的表表名_关联的表表名,这要比较好找是哪两张表之间的关系。

    推荐阅读