开源数据库MySQL数据库定义语言DDL

Posted 资本家的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源数据库MySQL数据库定义语言DDL相关的知识,希望对你有一定的参考价值。

DDL-库

定义库

创建业务数据库

语法:

  • CREATE DATABASE 数据库名
  • CREATE DATABASE discuz

数据库名要求

  • 区分大小写
  • 唯一性
  • 不能使用关键字如create select
  • 不能单独使用数字和特殊符号“如-"
  • 正常的:用拼音或单词即可。

查看所有数据库

  • SHOW DATABASES;

选择/进入数据库

  • USE 数据库名
  • SELECT database();
  • 调用函数,查询当前库

删除数据库

  • DROP DATABASE 数据库名

系统中的位置

  • /var/lib/mysql/:数据库的实体-清理/备份


数据类型

数值类型

  • ​整数类型 int
  • 浮点数类型 float:小数​

字符串类型

  • 字符系列 CHARVARCHAR
  • 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(4)数据库定义语言DDL_DDL语句

mysql> insert into school.student values(1,jack,m,20,book);  //插入数据
mysql> select * from school.student; //查看表内容

开源数据库MySQL(4)数据库定义语言DDL_DDL语句_02

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(4)数据库定义语言DDL_mysql_03

  • 插入数据
mysql>  insert into school.student4(name,sex,age) values
-> (jack,male,19),
-> (tom,male,23);
  • 查询表内容

开源数据库MySQL(4)数据库定义语言DDL_centos7_04

  • 插入非法数据

开源数据库MySQL(4)数据库定义语言DDL_mysql_05

  • 主键设置了自动增长,再次尝试插入数据。成功(注意不要插入主键)

开源数据库MySQL(4)数据库定义语言DDL_DDL语句_06

开源数据库MySQL(4)数据库定义语言DDL_centos7_07


设置唯一约束 UNIQUE

  • unique唯一的特性。
  • unique是可以为空的。
  • 为部门创建一张员工信息表

方法1:

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(4)数据库定义语言DDL_DDL语句_08

  • 插入数据
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已有值

开源数据库MySQL(4)数据库定义语言DDL_mysql_09


设置外键约束 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(4)数据库定义语言DDL_DDL语句_10

  • 插入数据
mysql> insert into company.employees values (zhangsan,zhangsan@126.com);
mysql> insert into company.payroll values (1,zhangsan,20000.23);

开源数据库MySQL(4)数据库定义语言DDL_linux_11

  • 当父表中某个员工的记录修改时,子表也会同步修改
  • 当父表中删除某个记录,子表也会同步删除该记录。


设置复合主键约束 PRIMARY KEY

  • 解决单列主键无法保持唯一性的问题
  • 例如:记录主机地址和服务的数据表是否运行的表。

开源数据库MySQL(4)数据库定义语言DDL_linux_12

  • 创建数据表
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(4)数据库定义语言DDL_centos7_13

  • 插入数据
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(4)数据库定义语言DDL_linux_14

  • 复合主键是当多列值组合唯一。

附加复合主键案例

在mysql系统内部对于mysql账户的记录就是复合主键(用户名+主机地址)

开源数据库MySQL(4)数据库定义语言DDL_mysql_15


设置字段值增 AUTO_INCREMENT

  • 配合整数型,主键使用自动增长约束。
mysql> CREATE TABLE company.department3 (
-> dept_id INT PRIMARY KEY AUTO_INCREMENT,
-> dept_name VARCHAR(30),
-> comment VARCHAR(50)
-> );

开源数据库MySQL(4)数据库定义语言DDL_mysql_16

  • 插入数据
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); //合法数据。未插入序号,但是在查询时会自动增加。
  • 查看信息

开源数据库MySQL(4)数据库定义语言DDL_DDL语句_17

以上是关于开源数据库MySQL数据库定义语言DDL的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之数据定义语言(DDL)

mysql开源数据库实战sql语言2

MySQL语法------16-----DDL语言-数据定义

mysql DDL语句(数据定义语言)

MySQL基础-- [SQL(结构化查询语言), DDL(数据定义语言)]

深入浅出MySQL-DDL语句