MariaDB 表的基本操作(3)

2023-05-16

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB来代替MySQL的InnoDB,MariaDB由MySQL的创始人Michael Widenius主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购MySQL的所有权也落入Oracle的手中.MariaDB名称来自MichaelWidenius的女儿Maria的名字.

在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位,数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的、每一行代表一条唯一的记录,每一列代表记录中的一个域.

创建数据表

在创建完数据库之后,接下来的工作就是创建数据表.所谓创建数据表,指的是在已经创建好的数据库中建立新表,创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性等)约束的过程,本节将介绍创建数据表的语法形式、如何添加主键约束、外键约束、非空约束等.

在创建表之前,应使用use <数据库名称>,进入一个数据库,以下是一个数据表创建的语法规则:

create table <表名>
(
          字段名1,数据类型 [列级别约束条件] [默认值],
          字段名2,数据类型 [列级别约束条件] [默认值],
          字段名3,数据类型 [列级别约束条件] [默认值],
......
           [表级别约束条件]
);

使用create table 创建表,必须指定以下信息:

1.要创建的表名称,不区分大小写,且不能使用SQL语句中的关键字
2.数据表中的每一个列(字段),的名称和数据类型,如果创建多列,要用逗号隔开

实例: 根据以下表结构信息,创建一个员工表tb_user,并查看规则.

字段名称数据类型备注
idINT(11)员工编号
nameVARCHAR(25)员工名称
deptIdINT(11)所在部门编号
salaryFLOAT工资

1.首先我们先来创建一个lyshark的数据库,用来存储表结构,并指定采用utf8编码.

MariaDB [(none)]> create database lyshark charset utf8;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lyshark            |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.01 sec)

MariaDB [(none)]> 

2.进入lyshark这个数据库,并更具题目要求创建这个表结构.

MariaDB [(none)]> use lyshark
Database changed

MariaDB [lyshark]> create table tb_user
    -> (
    -> id int(11),
    -> name varchar(25),
    -> deptId int(11),
    -> salary float
    -> );
Query OK, 0 rows affected (0.01 sec)

3.查看这个数据表,已经创建成功啦.

MariaDB [lyshark]> show tables;
+-------------------+
| Tables_in_lyshark |
+-------------------+
| tb_user           |
+-------------------+
1 row in set (0.00 sec)

MariaDB [lyshark]> desc tb_user;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | YES  |     | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

MariaDB [lyshark]>

◆使用主键约束◆

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

定义单字段主键

实例: 定义一个数据表tab_1id字段定义为主键primary key,其SQL语句的写法如下:

MariaDB [lyshark]> create table tab_1
    -> (
    -> id int(10) primary key,
    -> name varchar(20),
    -> deptid int(10),
    -> salary float
    -> );
Query OK, 0 rows affected (0.01 sec)

MariaDB [lyshark]>

查看一下表结构,会发现在id字段上多出来一个key,这就把它定义成主键了.

MariaDB [lyshark]> desc tab_1;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(10)     | NO   | PRI | NULL    |       |         #注意此处key列表,出现了主键标识
| name   | varchar(20) | YES  |     | NULL    |       |
| deptid | int(10)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

在定义主键约束时,还可以在表结构定义完成以后,在最后指定主键id.

MariaDB [lyshark]> create table tab_2
    -> (
    -> id int(10),
    -> name varchar(20),
    -> deptid int(10),
    -> salary float,
    -> primary key(id)
    -> );
Query OK, 0 rows affected (0.01 sec)

定义多字段主键

实例: 定义数据表tab_3,将name字段与deptid字段组合在一起,成为tab_3的多字段联合主键.

MariaDB [lyshark]> create table tab_3 
    -> (
    -> name varchar(20),
    -> deptid int(10),
    -> salary float,
    -> primary key(name,deptid)
    -> );
Query OK, 0 rows affected (0.00 sec)

查看一下结构吧:

MariaDB [lyshark]> desc tab_3;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name   | varchar(20) | NO   | PRI |         |       |
| deptid | int(10)     | NO   | PRI | 0       |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

◆使用外键约束◆

外键用来在两个表的数据之间建立链接,它可以是一列或者多列.一个表可以有一个或多个外键,外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值.

外键:首先它是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键.外键主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行.外键的作用是保持数据的一致性、完整性.

主表(父表):两个具有关联关系的表,相关联字段中,主键所在的那个表既是主表.
从表(子表):两个具有关联关系的表,相关联字段中,外键所在的那个表既是从表.

创建外键的语法规则:

[constraint <外键名>] foreign key 字段名1 [,字段名2,......]

peferences <主表名> 主键列1 [,主键列2,....]

实例: 创建一个tb_dept指定为主表,把tb_emp指定为从表,将两表指定字段相关联.

1.首先创建一个部门表tb_dept,表结构如下所示.

字段名称数据类型备注
idINT(11)部门编号
nameVARCHAR(22)部门名称
locationVARCHAR(50)部门位置
MariaDB [lyshark]> create table tb_dept
    -> (
    -> id int(11) primary key,
    -> name varchar(22) NOT NULL,
    -> location varchar(50)
    -> );
Query OK, 0 rows affected (0.01 sec)

2接着定义数据表tb_emp,让它的deptid字段,作为外键关联到tb_dept的主键id字段上,SQL语句如下:

MariaDB [lyshark]> create table tb_emp
    -> (
    -> id int(10) primary key,
    -> name varchar(25),
    -> deptid int(10),
    -> salary float,
    -> constraint fk_empdept foreign key(deptid) references tb_dept(id)
    -> );
Query OK, 0 rows affected (0.00 sec)

以上语句执行成功后,在表tb_emp上添加了名称为fk_empdept的外键约束,外键字段为deptid,其依赖于tb_dept表中的,主键id.

查看一下结构,理解下吧:

MariaDB [lyshark]> desc tb_dept;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| name     | varchar(22) | NO   |     | NULL    |       |
| location | varchar(50) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

MariaDB [lyshark]> desc tb_emp;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(10)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptid | int(10)     | YES  | MUL | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

MariaDB [lyshark]> 

◆使用非空约束◆

非空约束(Not Null Constraint)指定字段的值不能为空,对于使用非空约束的字段,如果用户不给指定数值,则报错.

非空约束语法规则:

字段名 数据类型  not null

实例:定义数据表tab_4,指定员工名称不能为空,SQL语句如下,执行后则name字段将不能为空:

MariaDB [lyshark]> create table tab_4
    -> (
    -> id int(10) primary key,
    -> name varchar(20) not null,
    -> salary float
    -> );
Query OK, 0 rows affected (0.00 sec)


◆使用唯一约束◆

唯一性约束(Unique Constraint):要求该列唯一,允许为空,但只能出现一个空值,唯一约束可以确保数据不重复.

在定义是完列表之后直接指定唯一约束,语法如下:

字段名 数据类型 unique

实例1: 创建tab_5表,并指定字段name为唯一约束,SQL语句如下:

MariaDB [lyshark]> create table tab_5
    -> (
    -> id int(10) primary key,
    -> name varchar(20) unique,
    -> location varchar(50)
    -> );
Query OK, 0 rows affected (0.01 sec)

实例2: 还可以在定义完字段,以后来指定约束条件.

MariaDB [lyshark]> create table tab_6
    -> (
    -> id int(10) primary key,
    -> name varchar(20),
    -> location varchar(50),
    -> constraint sth unique(name)
    -> );
Query OK, 0 rows affected (0.00 sec)

uniqueprimary key区别:一个表可以有多个字段声明成unique,但只能有一个primary key声明.

◆使用默认约束◆

默认约束(Default Constraint)也就是指定默认值,如果不填写则自动使用默认值.

默认约束语法规则如下:

字段名 数据类型 default 默认值

实例: 定义一个表名称tab_7并指定salary自动默认工资为500,如不填写此项默认是500.

MariaDB [lyshark]> create table tab_7
    -> (
    -> id int(10) primary key,
    -> name varchar(20) not null,
    -> salary float default 500
    -> );
Query OK, 0 rows affected (0.00 sec)

◆设置表自增长◆

在数据库应用中,经常希望在每次插入新记录时,系统自动生成字段的主键值.可以通过为表主键添加AUTO_INCREMENT关键字来实现.默认的,在MySQL中AUTO_INCREMENT的初始值是1,每次新增一条记录,字段值自动增加1,一个表只能有一个字段使用AUTO_INCREMENT约束,且字段必须为主键的一部分.

设置表的自增长语法规则如下:

字段名 数据类型 auto_increment

实例: 定义一个数据表tab_8指定id员工编号为自动增长模式,SQL语句如下:

MariaDB [lyshark]> create table tab_8
    -> (
    -> id int(10) primary key auto_increment,
    -> name varchar(20) not null,
    -> salary float
    -> );
Query OK, 0 rows affected (0.01 sec)

此处我们插入一些数据,但是不写ID编号这一栏.

MariaDB [lyshark]> insert into tab_8(name,salary) values('lyshark',1000),('admin',200);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

接着查看一下插入的数据,你会发现ID这一个字段已经自动填充上了.

MariaDB [lyshark]> select * from tab_8;
+----+---------+--------+
| id | name    | salary |
+----+---------+--------+
|  1 | lyshark |   1000 |
|  2 | admin   |    200 |
|  3 | lyshark |   1000 |
|  4 | admin   |    200 |
+----+---------+--------+
4 rows in set (0.00 sec)


查询表结构

使用SQL语句创建好数据表之后,可以查看表结构的定义,以确认表的定义是否正确.在MySQL中,查看表结构可以使用describeshow create table语句.

◆desc查询表结构◆

先来看一下语法格式:

describe 表名称; or desc 表名称;

实例: 查询tab_8数据表的表结构.

MariaDB [lyshark]> describe tab_8;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(10)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | NO   |     | NULL    |                |
| salary | float       | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

MariaDB [lyshark]> desc tab_8;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(10)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | NO   |     | NULL    |                |
| salary | float       | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

MariaDB [lyshark]> 

◆show查询表结构◆

先来看一下语法格式:

show create table <表名> \G

实例: 显示tab_8表的详细数据信息.

MariaDB [lyshark]> show create table tab_8 \G

*************************** 1. row ***************************
       Table: tab_8
Create Table: CREATE TABLE `tab_8` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

注释: 当然也可以查询一个数据库啦,比如查询lyshark这个数据库的创建信息.

MariaDB [lyshark]> show create database lyshark;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| lyshark  | CREATE DATABASE `lyshark` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)


修改数据表

修改表指的是修改数据库己经存在的数据表的结构.MySQL使用alter table语句修改表,常用的修改表的操作有:修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等.

◆修改表名称◆

如果一个数据表名称需要修改肿莫办,MySQL中是通过alter table语句来实现表名称的修改的,语法规则如下:

alter table <旧表名> rename [to] <新表名>;

实例: 将数据表tab改名成tab_lyshark.

MariaDB [lyshark]> show tables;
+-------------------+
| Tables_in_lyshark |
+-------------------+
| tab               |
| tab_8             |
+-------------------+
2 rows in set (0.00 sec)

MariaDB [lyshark]> alter table tab rename to tab_lyshark;      #将tab表改成tab_lyshark
Query OK, 0 rows affected (0.00 sec)

MariaDB [lyshark]> show tables;
+-------------------+
| Tables_in_lyshark |
+-------------------+
| tab               |
| tab_lyshark       |
+-------------------+
2 rows in set (0.00 sec)

◆修改字段名◆

上面的小例子是修改表的名称,当我们想要修改字段名称时,可以使用以下SQL语句:

alter table <表名> change <旧字段名> <新字段名> <新数据类型>

#旧字段名:指修改前的字段名    新字段名:指修改后的字段名    新数据类型:指修改后的数据类型 

实例: 将表tab_testsalary字段名改为lyshark并修改数据类型为varchar(30).

MariaDB [lyshark]> desc tab_test;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(10)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(40) | YES  |     | NULL    |                |
| salary | float       | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

MariaDB [lyshark]> alter table tab_test change salary lyshark varchar(30);     #将字段名salary改为lyshark数据类型改成varchar(30)
Query OK, 4 rows affected (0.00 sec)               
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

MariaDB [lyshark]> 

◆修改字段类型◆

每个字段都会有自己的数据类型,加入有一天你需要修改字段的数据类型,可以使用以下SQL语句:

alter table <表名> modify <字段名> <数据类型>

# 表名:指的是欲修改的表名称    字段名:欲要修改的字段名    数据类型:你要修改成的类型

实例: 将表tab_testname字段数据类型由varchar(20)修改为varchar(40)

MariaDB [lyshark]> desc tab_test;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(10)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | NO   |     | NULL    |                |
| salary | float       | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

MariaDB [lyshark]> alter table tab_test modify name varchar(40);         #将类型从varchar(20)改成varchar(40)
Query OK, 4 rows affected (0.01 sec)               
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [lyshark]> desc tab_test;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(10)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(40) | YES  |     | NULL    |                |
| salary | float       | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

MariaDB [lyshark]> 

◆添加一个字段◆

随着业务的需求变化,可能需要在已经存在的表中添加新的字段,一个完整字段包括,字段名,数据类型,完整性约束,添加字段的SQL语法规则如下:

alter table <表名> add <新字段> <数据类型>

# 表名:指定表名称    新字段:欲要添加的新字段   数据类型:指定添加的类型
# [约束条件] [first | after 已存在字段名]:指的是插入在那个字段前或者后.

在末尾添加: 添加无完整约束条件的字段,在tab_test表中添加一个int类型字段manager

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

MariaDB [lyshark]> alter table tab_test add manager int(10);      #添加一个manager字段,类型为int
Query OK, 4 rows affected (0.01 sec)               
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

MariaDB [lyshark]> 

在末尾添加: 添加有完整性约束条件的字段,在tab_test表中添加clound字段,类型为varchar(20)

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

MariaDB [lyshark]> alter table tab_test add clound varchar(20) not null;   #添加一个clound字段,并且不允许为空
Query OK, 4 rows affected (0.01 sec)               
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
| clound  | varchar(20) | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

在表开头添加:tab_test表的第一列添加一个新字段,字段名wang类型int(4)

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
| clound  | varchar(20) | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

MariaDB [lyshark]> alter table tab_test add wang int(4) first;   #在表的第一列添加一个字段名称是wang,类型是int
Query OK, 4 rows affected (0.00 sec)               
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| wang    | int(4)      | YES  |     | NULL    |                |
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
| clound  | varchar(20) | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

指定位置添加:tab_test表的指定位置添加一个字段,在name列的后面插入一个xxxx字段类型为int

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| wang    | int(4)      | YES  |     | NULL    |                |
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
| clound  | varchar(20) | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

MariaDB [lyshark]> alter table tab_test add xxxx int(4) after name;   #在name字段后面插入一个xxxx,类型int
Query OK, 4 rows affected (0.01 sec)               
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| wang    | int(4)      | YES  |     | NULL    |                |
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| xxxx    | int(4)      | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
| clound  | varchar(20) | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

◆删除一个字段◆

有时候我们需要删除指定无用字段,删除字段是将数据表中的某个字段从表中移除,这里可以使用alert table drop命令来完成,SQL语法格式如下:

alter table <表名> drop <字段名>

实例: 删除tab_test表中的clound字段.

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| wang    | int(4)      | YES  |     | NULL    |                |
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| xxxx    | int(4)      | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
| clound  | varchar(20) | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

MariaDB [lyshark]> alter table tab_test drop clound;        #删除指定字段 clound
Query OK, 4 rows affected (0.01 sec)               
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| wang    | int(4)      | YES  |     | NULL    |                |
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| xxxx    | int(4)      | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

◆修改字段排列位置◆

对于一个表来说,在创建的时候,字段在表中的排列顺序就已经确定了,有时候,我们还需要对其进行微调,我们可以这样写SQL语句如下:

alter table <表名> modify <字段1> <数据类型> first | after <字段2>

#上面说明,将字段1放到<first|after>字段2的前面或后面

修改到第一列:tab_test表中的lyshark字段移动到第1列

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| wang    | int(4)      | YES  |     | NULL    |                |
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| xxxx    | int(4)      | YES  |     | NULL    |                |
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

MariaDB [lyshark]> alter table tab_test modify lyshark varchar(30) first;     #将lyshark字段调整到最顶端的位置
Query OK, 4 rows affected (0.01 sec)               
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| lyshark | varchar(30) | YES  |     | NULL    |                |
| wang    | int(4)      | YES  |     | NULL    |                |
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| xxxx    | int(4)      | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

修改到指定位置:tab_test表中的manager字段放到lyshark字段的后面

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| lyshark | varchar(30) | YES  |     | NULL    |                |
| wang    | int(4)      | YES  |     | NULL    |                |
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| xxxx    | int(4)      | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

MariaDB [lyshark]> alter table tab_test modify manager int(10) after lyshark;  #把manager字段放到lyshark字段的后面
Query OK, 4 rows affected (0.01 sec)               
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| lyshark | varchar(30) | YES  |     | NULL    |                |
| manager | int(10)     | YES  |     | NULL    |                |
| wang    | int(4)      | YES  |     | NULL    |                |
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(40) | YES  |     | NULL    |                |
| xxxx    | int(4)      | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

◆修改表的存储引擎◆

存储引擎是MySQL中的数据存储在文件或者内存中时采用的不同技术实现,可以根据自己的需要,选择不同的引擎,甚至可以为每一张表选择不同的存储引擎.MySQL中主要存储引擎有:MyISAM、InnoDB、MEMORY、BDB、FEDERATED等.可以使用show engines语句查看系统支持的存储引擎.如下表是MySQL所支持的存储引擎.

引擎名称是否支持
FEDERATED
MRG_MYISAM
MyISAM
BLACKHOLE
CSV
MEMORY
ARCHIVE
InnoDB默认
PERFORMANCE_SCHEMA

更改一个表的存储引擎,可以使用的SQL语法规则:

alter table <表名> engine=<更改后的存储引擎名称>

更改引擎: 修改tab_test表的默认存储引擎为MyISAM

1.首先我们可以使用show create table先查看一下当前的存储引擎是什么,可以看到默认引擎是InnoDB

MariaDB [lyshark]> show create table tab_test \G
*************************** 1. row ***************************
       Table: tab_test
Create Table: CREATE TABLE `tab_test` (
  `lyshark` varchar(30) DEFAULT NULL,
  `manager` int(10) DEFAULT NULL,
  `wang` int(4) DEFAULT NULL,
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(40) DEFAULT NULL,
  `xxxx` int(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

2.接着执行修改命令,并查看一下变化.

MariaDB [lyshark]> alter table tab_test engine=MyISAM;
Query OK, 4 rows affected (0.00 sec)               
Records: 4  Duplicates: 0  Warnings: 0

MariaDB [lyshark]> show create table tab_test \G
*************************** 1. row ***************************
       Table: tab_test
Create Table: CREATE TABLE `tab_test` (
  `lyshark` varchar(30) DEFAULT NULL,
  `manager` int(10) DEFAULT NULL,
  `wang` int(4) DEFAULT NULL,
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(40) DEFAULT NULL,
  `xxxx` int(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1   #可以看到已经改变了
1 row in set (0.00 sec)

◆删除表的外键约束◆

对于数据库定义的外键,如果不需要可以将其删除掉,外键一旦删除,就会解除主表和从表的关联关系,MySQL中删除外键的语法如下:

alter table <表名> drop foreign key <外键约束名>

#外键约束名:指的是在定义表时constraint关键字后面的参数

删除外键: 删除tb_emp的外键约束

1.先来查看一下表的外键约束.

MariaDB [lyshark]> desc tb_emp;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(10)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptid | int(10)     | YES  | MUL | NULL    |       |   #外键标识MUL
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)


MariaDB [lyshark]> show create table tb_emp \G
*************************** 1. row ***************************
       Table: tb_emp
Create Table: CREATE TABLE `tb_emp` (
  `id` int(10) NOT NULL,
  `name` varchar(25) DEFAULT NULL,
  `deptid` int(10) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_empdept` (`deptid`),
  CONSTRAINT `fk_empdept` FOREIGN KEY (`deptid`) REFERENCES `tb_dept` (`id`)   #这里foreign key指定了外键
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

2.使用drop foreign key命令删除外键

MariaDB [lyshark]> alter table tb_emp drop foreign key fk_empdept;   #删除tb_emp表中的外键fk_empdept
Query OK, 0 rows affected (0.01 sec)               
Records: 0  Duplicates: 0  Warnings: 0


MariaDB [lyshark]> show create table tb_emp \G
*************************** 1. row ***************************
       Table: tb_emp
Create Table: CREATE TABLE `tb_emp` (
  `id` int(10) NOT NULL,
  `name` varchar(25) DEFAULT NULL,
  `deptid` int(10) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_empdept` (`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1   #此时已经没有foreign key 这一项了,说明删除成功
1 row in set (0.00 sec)


删除数据表

删除数据表就是将数据库中已存在的表从数据库移除,需要注意的是,在删除表的同时,表的定义和表中的所有数据均会被删除,因此再删除之前,最好做好备份,删除的SQL语法如下:

drop table [if exists] 表1,表2,.....表n

#参数 if exists=删除前判断删除的表是否存在,如果表不存在会报错。

删除表: 删除指定表tab_test

MariaDB [lyshark]> show tables;
+-------------------+
| Tables_in_lyshark |
+-------------------+
| tab_test          |
| tb_dept           |
| tb_emp            |
+-------------------+
10 rows in set (0.01 sec)

MariaDB [lyshark]> drop table if exists tab_test;
Query OK, 0 rows affected (0.00 sec)

MariaDB [lyshark]> show tables;
+-------------------+
| Tables_in_lyshark |
+-------------------+
| tb_dept           |
| tb_emp            |
+-------------------+
10 rows in set (0.01 sec)


转载于:https://www.cnblogs.com/LyShark/p/10168111.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MariaDB 表的基本操作(3) 的相关文章

  • MariaDB 不允许远程连接

    如屏幕截图所示 我已将帐户设置为允许远程连接 但如第二个屏幕截图所示 我仍然无法远程连接 我用于在虚拟机 Ubuntu 16 04 中进行测试 对我来说 我修复了更改文件的错误50 server cnf 我的服务器是Ubuntu 所以更改以
  • MariaDB 显示警告而不是错误

    玛丽亚数据库版本 10 6 4 MariaDB 1 10 6 4 maria focal SQL insert ignore into step is draft created by values 1 2 收到警告 MariaDB kit
  • MariaDB 在配置中设置时区

    如何在 MariaDB 配置中设置服务器时区 我在文档中唯一能找到的是使用命令行标志 但我不想这样做 default time zone 它适用于普通 MySQL 但不被 MariaDB 识别 It is default time zone
  • Java、JDBC INSERT ON DUPLICATE KEY UPDATE 通配符

    我有一个下一个 SQL 查询 const val INSERT OR UPDATE ITEM SQL INSERT INTO items owner id object id item id count enchant level item
  • 在 Windows 上运行 MySQL 或 MariaDB 服务器的最少文件 - (便携式 MySQL/MariaDB)

    我正在寻找 MariaDB 或 MySQL 运行所需的最少文件 而无需像便携式服务器一样安装它 我更喜欢 MariaDB 而不是 MySQL 我想将它嵌入到用 Delphi 编写的软件中 我的软件将能够根据需要启动和停止服务器 我用谷歌搜索
  • mariadb 服务器:我无法使用“mysql.server stop”停止服务器

    操作系统 10 13 6 几年前我用 homebrew 安装了 mariadb 服务器 但我很少使用它 今天 我尝试使用以下命令启动 mariadb mysql server start 我遇到了很多错误 所以我做了 brew update
  • SQL (Mariadb) 将由逗号分隔的字符串拆分为行

    我有这个专栏 names John Mary Joseph Eleanor Sophia Dani 我想要这个输出 names John Mary Joseph Eleanor Sophia Dani 它应该包括 SUBSTRING IND
  • Docker-Compose 持久数据问题

    我在配置持久数据时遇到问题Mariadb 我在用着docker compose 每个服务都在一个容器中 Nginx PHP FPM and Mariadb 一切正常 除了Mariadb不存储数据 每次重新启动容器时 我都会丢失所有数据 然后
  • 通过连接查询大型数据集(15+ 百万行)

    我正在尝试连接两个表 products and products markets While products记录不足一百万条 product markets接近2000万条记录 数据已更改 因此架构创建表中可能存在一两个拼写错误 CREA
  • 提高 mysql LOAD DATA / mysqlimport 的性能?

    我正在批处理CSV15GB 30mio 行 成mysql 8数据库 问题 任务大约需要 20 分钟 吞吐量约为 15 20 MB s 而硬盘能够以 150 MB s 的速度传输文件 我有一个 20GB 的 RAM 磁盘 用于保存我的 csv
  • Hibernate 的 MariaDB 方言类名称是什么?

    In Hibenate我在用MariaDB但我找不到方言类名称MariaDB 在 Hibernate 中 MySQL 5 方言名称是
  • 将 MariaDB 与实体框架结合使用

    最近 我读到一则新闻 说 MariaDB 是 MySQL 的替代品 因为MySQL 对集群 企业版的定价不友好 http www theregister co uk 2013 09 12 google mariadb mysql migra
  • 如何在 check 子句中使用 CURDATE()?

    我尝试创建一个表 其中 dateFrom 和 dateTo 字段需要高于今天的日期 所以我这样使用 CHECK CREATE TABLE Booking hotelNo int 10 guestNo int 10 dateFrom date
  • Linux 上是否有与 Mariadb 10 兼容的 ODBC 驱动程序?

    我尝试使用 MySQL ODBC 驱动程序 但编译时出现错误 MySQL ODBC 驱动程序适用于 Mariadb 5 5 但不适用于 Mariadb 10 那么有适用于 Mariadb 10 的 ODBC 驱动程序吗 我安装了MySQL
  • 使用 COUNT 后如何获得其他列上具有相同值的列的平均值?

    我有以下查询 SELECT COUNT id AS number of orders FROM orders WHERE MONTH date 5 GROUP BY item number MONTH date YEAR date 我得到以
  • 自动增量已自动重置回 1

    我刚刚遇到了一个我无法解决的问题 我有一个数据库表project queues它用作队列 我在其中存储一些记录 处理记录后 它们将被删除 删除是由 Rails 构造调用的record destroy在触发的循环中DELETE record
  • Sonarqube 5.5 和 mariadb

    我们正在尝试升级到最新的 sonarqube 5 5 我们有 mariadb 10 1 最新 从现在起我们的 sonarqube 就没有问题了 现在 升级后 sonarqube 将无法启动 它说 不支持的 mysql 版本 5 5 最低支持
  • 将 CTE 应用于递归查询

    我正在尝试应用 CTE 和递归查询 数据库为 MariaDB 10 2 或更高版本 业务规则如下 账户可以是控股账户 也可以是投资组合账户 控股由一定数量的货币组成 持股可以是活跃的也可以是非活跃的 一个投资组合包含零个或多个账户 并且这些
  • 如何在 Mysql 5.7 中更新 JSON 数组中的特定对象

    如何根据对象中的唯一值更新数组中的对象 假设这是我的 json 对象 存储在名为对象的表和名为内容的列中 table objects id 7383 content data id 111 active 1 id 222 active 1
  • 无法在 mysql 表中的值中使用破折号(-)[重复]

    这个问题在这里已经有答案了 我一直在尝试从 python 将数据插入 MYSQL 表 我的sql表中的字段是id token start time end time和no of trans 我想存储使用生成的令牌uuid4在令牌栏中 但由于

随机推荐