采得百花成蜜后,为谁辛苦为谁甜。这篇文章主要讲述开源数据库MySQL数据库定义语言DDL相关的知识,希望能为你提供帮助。
DDL-库定义库
创建业务数据库语法:
- CREATE DATABASE 数据库名
- CREATE DATABASE discuz
- 区分大小写
- 唯一性
- 不能使用关键字如create select
- 不能单独使用数字和特殊符号“如-"
- 正常的:用拼音或单词即可。
- SHOW DATABASES;
- USE 数据库名
- SELECT database();
- 调用函数,查询当前库
- DROP DATABASE 数据库名
- /var/lib/mysql/:数据库的实体-清理/备份
数据类型数值类型
- ?整数类型 int
- 浮点数类型 float:小数?
- 字符系列 CHAR和VARCHAR
- char的长度不可变。
- varchar的长度可以增加。
- 枚举类型 ENUM:单选
- 集合类型 SET:多选时间和日期类型
- 年 YEAR
- 日期DATE
- 时间TIME
- 日期和时间DATETIME
完整性约束
- 数据库中某列使用完整性约束来限定此类要求。
- 用于保证数据的完整性和一致性
约束条件
| 说明 |
PRIMARY KEY (PK) | 标识该字段为该表的主键,可以唯一的标识记录,不可以为空 |
FOREIGN KEY (FK) | 标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键)之间的关联 |
UNIQUE KEY
(UK) | 标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY |
AUTO_INCREMENT | 标识该字段的值自动增长(整数类型,而且为主键) |
DEFAULT | 为该字段设置默认值 |
NOT NULL
| 标识该字段不能为空,是否允许为空默认NULL,可设置NOT NULL,字段不允许为空,必须赋值 |
UNSIGNED | 无符号,正数 |
ZEROFILL
| 使用0填充,例如0000001 |
默认值、空值:DEFAULT、NOT NULL
- 创建表
mysql> create table school.student2(
-> id int not null,
-> name varchar(50) not null,
-> sex enum (m,f) default m not null,
-> age int unsigned default 18 not null,
-> hobby set(music,disc,dance,book) default book,dance );
- 查看表结构
mysql> desc shool.student2;
mysql> insert into school.student values(1,jack,m,20,book); //插入数据
mysql> select * from school.student; //查看表内容
mysql> insert into school.student2 values(3,NULL,m,40,book); //插入非法数据
ERROR 1048 (23000): Column name cannot be null//不能为空值
设置主键约束 PRIMARY KEY?
- primary key 字段的值是不允许重复,且不允许NULL(UNIQUE + NOT NULL)
- 单列做主键/多列做主键(复合主键)
mysql> create table school.student3(
-> id int primary key not null auto_increment,
-> name varchar(50) not null,
-> sex enum(male,female) not null default male,
-> age int not null default 18
-> );
方法二:
mysql> create table school.student4(
-> id int auto_increment not null,
-> name varchar(50) not null,
-> sex enum(male,female) not null default male,
-> age int not null default 18,
-> primary key(id)
-> );
- 查询表结构
mysql> desc school.student3;
- 插入数据
mysql> insert into school.student4(name,sex,age) values
-> (jack,male,19),
-> (tom,male,23);
- 查询表内容
- 插入非法数据
- 主键设置了自动增长,再次尝试插入数据。成功(注意不要插入主键)
设置唯一约束 UNIQUE
- unique唯一的特性。
- unique是可以为空的。
- 为部门创建一张员工信息表
mysql> CREATE TABLE company.department1 (
-> dept_id INT,
-> dept_name VARCHAR(30) UNIQUE,
-> comment VARCHAR(50));
方法2:
mysql> CREATE TABLE company.department2 (
-> dept_id INT,
-> dept_name VARCHAR(30),
-> comment VARCHAR(50),
-> UNIQUE(dept_name)
-> );
- 查看表结构
- 插入数据
mysql> insert into company.department1 values (1,zhangsan,yyy); // 插入合法数据
mysql> insert into company.department1 values (1,NULL,yyy); //插入空值数据
mysql> insert into company.department1 values (1,NULL,yyy); //插入空值数据(空值是允许重复的)
mysql> insert into company.department1 values (1,zhangsan,yyy); //插入非法数据
ERROR 1062 (23000): Duplicate entry zhangsan for key dept_name//zhangsan已有值
设置外键约束 FOREIGN KEY
- 创建父表
mysql> create table company.employees(
-> name varchar(50) not null,
-> mail varchar(20),
-> primary key(name)
-> )engine=innodb;
- 创建子表
mysql> create table company.payroll(
-> id int not null auto_increment,
-> name varchar(50) not null,
-> payroll float(10,2) not null,
-> primary key(id),
-> foreign key(name) references employees(name) on update cascade on delete cascade
//子表name外键,关联父表(employees 主键name),同步更新,同步删除
-> )engine=innodb;
- 查看表结构
- 插入数据
mysql> insert into company.employees values (zhangsan,zhangsan@126.com);
mysql> insert into company.payroll values (1,zhangsan,20000.23);
- 当父表中某个员工的记录修改时,子表也会同步修改
- 当父表中删除某个记录,子表也会同步删除该记录。
设置复合主键约束 PRIMARY KEY
- 解决单列主键无法保持唯一性的问题
- 例如:记录主机地址和服务的数据表是否运行的表。
- 创建数据表
mysql> create table ip.service(
-> host_ip varchar(15) not null,
-> service_name varchar(10) not null,
-> port varchar(5) not null,
-> allow enum(Y,N) default N,
-> primary key(host_ip,port)//关键部分,复合主键设置方法
-> );
- 查看表结构
- 插入数据
mysql> insert into ip.service values (192.168.2.168,ftp,21,Y);
mysql> insert into ip.service values (192.168.2.168,httpd,80,Y);
- 复合主键是当多列值组合唯一。
在mysql系统内部对于mysql账户的记录就是复合主键(用户名+主机地址)
设置字段值增 AUTO_INCREMENT
- 配合整数型,主键使用自动增长约束。
mysql> CREATE TABLE company.department3 (
-> dept_id INT PRIMARY KEY AUTO_INCREMENT,
-> dept_name VARCHAR(30),
-> comment VARCHAR(50)
-> );
- 插入数据
mysql> insert into company.department3 values(1,zs,manager); //合法数据
mysql> insert into company.department3 values(1,zs,manager); //非法数据
ERROR 1062 (23000): Duplicate entry 1 for key PRIMARY
mysql> insert into company.department3 values(2,zs,manager); //合法数据
mysql> insert into company.department3(dept_name,comment) values (zs,manager); //合法数据。未插入序号,但是在查询时会自动增加。
- 查看信息
推荐阅读
- 如何查找Linux系统中密码为空的所有用户
- 自动化运维工具AnsiblePlaybook
- 拯救 openLDAP 的上古管理界面,我写了一个现代化的 ldap 管理后台 go-ldap-admin
- Android中的Firebase数据描述排序
- 调用getText()不在Android应用程序中编译
- 来自Postman的回复显示200,但Android返回403
- Android Google登录失败com.google.android.gms.common.api.ApiException(12500)
- 无法找到com.android.tools.build:gradle:2.3.+的任何匹配项
- 在React App中使用或不使用PouchDB加载预构建的SQlite数据库的正确方法是什么