数据库的DDL
一、数据库的安装
基于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~99999,若使用整数,则 MEDIUMINT UNSIGNED是最好的类型;若需要存储小数,则使用FLOAT 类型。
DOUBLE类型精度比FLOAT类型高,因此要求存储精度较高时应选择DOUBLE类型 - 浮点数和定点数
浮点数FLOAT、DOUBLE相对于定点数DECIMAL的优势是:在长度一定的情况下,浮点数能表示更大的数据范围。由于浮点数容易产生误差,因此对精确度要求比较高时,建议使用DECIMAL来储,DECIMAL在MySQL中是以字符串存储的,用于定义货币等对精确度要求较高的数据。 在数据迁移中,float(M,D)是非标准SQL定义,数据库迁移可能会出现问题,最好不要这样使用。另外,两个浮点数进行减法和比较运算时也容易出问题,因此在进行计算的时候,一定要小心。进行数值比较时,最好使用DECIMAL类型。 - 日期与时间类型
只需要记录年份,使用YEAR类型;
只记录时间,则使用TIME类型;
同时需要记录日期和时间,可以使用TIMESTAMP或者DATETIME类型。
TIMESTAMP列的取值范围小于DATETIME的取值范围,存储范围较大的日期最好使用DATETIME。
TIMESTAMP也有一个DATETIME不具备的属性。默认的情况下,当插入一条记录但并没有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。因此当需要插入记录的同时插入当前时间时,使TIMESTAMP是方便的。另外,TIMESTAMP在空间上比 DATETIME更有效。 - 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 表约束
数据的完整性是指数据的可靠性和准确性。
- 实体完整性:实体的完整性强制表的标识符列或主键的完整性(通过索引,唯一约束,主键约束或标识列 属性)。
- 域完整性:限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过外键约束,检查约束,默认值定义,非空约束和规则)。
- 引用完整性:在删除和输入记录时,引用完整性保持表之间已定义的关系.引用完整性确保键值在所有表中一致.这样的一致辞性要求不能引用不存在的值.如果一个键值更改了,那么在整个数据库中,对该键值的引用要进行一致的更改。
- 自定义完整性:用户自己定义的业务规则。
四种完整性约束:
实体完整性:唯一约束、主键约束、标识列
域完完整性:限制数据类型、外键约束、默认值、非空约束
引用完整性:外键
自定义完整性:过程,触发器等
约束是在表上强制执行的一些数据校验规则,被插入、修改或删除的数据必须符合在相关字段上设置的这些约束条件。
五类完整性约束:
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)主键选取原则
- 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
- 主键应该是单列的,以便提高连接和筛选操作的效率。
- 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
- 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
- 主键应当有计算机自动生成
我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的
属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记
录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助
我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键
构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。
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
- 创建数据表customers,在c_num字段上添加主键约束和自增约 束,在c_birth字段上添加非空约
束。 - 将c_contact字段插入c_birth字段后面。
- 将c_name字段数据类型改为VARCHAR(70)。
- 将c_contact字段改名为c_phone。
- 增加c_gender字段,数据类型为CHAR(1)。
- 将表名修改为customers_info。
- 删除字段c_city
- 修改数据表的存储引擎为MyISAM。
- 在Market中创建数据表orders。
- 创建数据表orders,在o_num字段上添加主键约束和自增约束,在 c_id字段上添加外键约束,关联customers表中的主键c_num。
- 删除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表
  学生表: 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_被添加外键的表表名_关联的表表名,这要比较好找是哪两张表之间的关系。