MySQL-数据库,数据表的基本操作
数据库,数据表的基本操作
- 1 数据库的基本操作
-
- 1.1 创建数据库
- 1.2 删除数据库
- 2 数据表的基本操作
- 2.1 创建数据表
1 数据库的基本操作
mysql安装完成后,登陆数据库,执行命令查看数据库
[root@centos7 ~]# mysql -u root -pMysql_888
执行命令查看数据库。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
1.1 创建数据库
创建数据库的命令语法格式
creata database database_name;
创建数据库TEST,并查看数据库TEST的定义
mysql> creata database TEST;
mysql> show create database TEST\\G
* 1. row *Database: TEST
Create Database: CREATE DATABASE `TEST` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */
1 row in set (0.00 sec)mysql>
1.2 删除数据库
删除数据库的命令语法格式
drop database database_name;
删除完成后查看定义,会返回ERROR报错。
2 数据表的基本操作
2.1 创建数据表
数据表是属于数据库的,在创建对应的数据表之前,需要先切换到对应的数据库,切换到TEST数据库中。
mysql> use TEST;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql>
2.1.1 主键约束
在 MySQL 中,主键是一种用于唯一标识数据表中每个记录的列或列组合。它是一个特殊的唯一键约束,主要用于帮助保证表中每条记录都能被唯一标识并且方便快速地查询。主键的约束支持以下特点:
唯一性:主键必须唯一标识某个记录,不能有重复的值。这可以帮助保证表中每个记录的唯一性和准确性。
非空性:主键不允许设置为 NULL 值。该限制可以有效保护表中数据的完整性。
确定性:主键值必须是已知的非复合值。因此,在数据库表中,一个字段最多只能有一个主键。
单字段主键:
CREATE TABLE tb_01
(
id INT(11) PRIMARY KEY,
name VARCHAR(25),
deptId INT(11),
salary FLOAT
);
多字段主键:
CREATE TABLE tb_02(
name VARCHAR(25),
deptId INT(11),
salary FLOAT,
PRIMARY KEY(name,deptId)
);
2.1.2 外键约束
在 MySQL 中,外键是指用来标识两个表之间关系的一种约束。外键通常用于建立表之间的联系,它可以帮助保证数据表之间的一致性和完整性。外键的实现需要在表中定义一个特殊的列,并将该列与另一个表的主键或唯一键相连。
外键约束支持以下特点:
引用完整性:防止从表中插入无法与主表关联的行,从而确保数据之间的连贯性和一致性。
自动更新和删除:当主表的某行被更新或删除时,关联的从表的数据也会相应地被自动更新或删除。
创建表tb_03和tb_04,并让tb_04的deptId作为外键关联到tb_03的主键id。
CREATE TABLE tb_03
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
location VARCHAR(50)
);CREATE TABLE tb_04
(
id INT(11) PRIMARY KEY,
name VARCHAR(25),
deptId INT(11),
salary FLOAT,
CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
);
2.1.3 非空约束
MySQL的非空约束是指在创建表时,可以指定某一列的数据值不能为NULL。如果试图将NULL值插入到具有非空约束的列中,将会产生错误。关键字NOT NULL。
创建一个具有非空约束的表tab_05,其中name和age列都不能为NULL。
CREATE TABLE tab_05 (id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT NOT NULL
);
如果试图向该表中插入一个NULL值,MySQL将会报错。例如:
INSERT INTO tab_05 (id, name, age)
VALUES (1, NULL, 25);
将会产生如下错误:
Error Code: 1048. Column 'name' cannot be null
2.1.4 唯一性约束
MySQL的唯一性约束用于确保在某个列中不允许有重复的值。也就是说,一个唯一性约束不能对整个表启用,而只能针对某个或某些列启用。在启用唯一性约束后,任何尝试插入具有重复值的记录将会被拒绝。
创建一个具有唯一性约束的表users,其中email列不能有重复值。关键字UNIQUE。
CREATE TABLE tab_06 (id INT PRIMARY KEY,name VARCHAR(50),email VARCHAR(50) UNIQUE,password VARCHAR(50)
);
如果试图向该表中插入一个已经存在的email值,MySQL将会报错。
例如:
INSERT INTO tab_06 (id, name, email, password)
VALUES (1, 'John', 'john@example.com', 'password');
如果之后再次尝试插入相同的email值,MySQL将会报错:
Error Code: 1062. Duplicate entry 'john@example.com' for key 'email'
2.1.5 默认约束
默认值指的是在插入数据时如果一个列没有明确地指定一个值,则将使用指定的默认值来填充该列。如果没有指定默认值,则该列将被设置为NULL。
可以在创建表时或使用ALTER TABLE语句时指定列的默认值。
创建表tab_07时,可以指定列birthday的默认值为’1990-01-01’:
CREATE TABLE tab_07 (id INT PRIMARY KEY,name VARCHAR(50),email VARCHAR(50),birthday DATE DEFAULT '1990-01-01'
);
2.1.6 自增列
自增列是一种特殊的列,用于自动为每个插入的行生成唯一的数字标识符。自增列通常用作主键列,确保每个行都具有唯一的标识符。
在MySQL中,可以通过使用AUTO_INCREMENT关键字在列定义中创建自增列。
CREATE TABLE tab_08 (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),email VARCHAR(50)
);
还可以使用ALTER TABLE语句将现有的列转换为自增列。例如,如果在创建表时未指定AUTO_INCREMENT关键字,则可以使用以下命令将其添加到id列中
ALTER TABLE users MODIFY COLUMN id INT AUTO_INCREMENT;
需要注意的是,自增列必须是主键列的一部分。此外,如果您在表中使用多个自增列,则每个自增列的值将是唯一的,但不一定连续。
最后,如果需要知道最后一次插入的自增列值,可以使用LAST_INSERT_ID()函数。
INSERT INTO users (name, email)
VALUES ('Jane', 'jane@example.com');SELECT LAST_INSERT_ID();
此操作将插入一行数据并返回最后一个自增列值。
2.2 查看数据表结构
2.2.1 查看表基本结构语句DESC
DESC可以查看表的字段信息,其中包括字段名,字段数据类型,是否为主键,是否有默认值等。
mysql> desc tab_06;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
2.2.2 查看表详细结构语句SHOW CREATE TABLE
SHOW CREATE TABLE 可以显示创建表时候的create table语句。
mysql> show create table tab_06;
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tab_06 | CREATE TABLE `tab_06` (`id` int NOT NULL,`name` varchar(50) DEFAULT NULL,`email` varchar(50) DEFAULT NULL,`password` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
2.3 修改数据表
2.3.1 修改表名
将之前的表tab_06,修改为tab_07,使用alter table old_tab rename [to] new_tab; 语法。
mysql> alter table tab_06 rename to tab_07;
Query OK, 0 rows affected (0.01 sec)mysql> show tables;
+-----------------+
| Tables_in_TEST |
+-----------------+
| tab_07 |
| tag |
| user |
+-----------------+
14 rows in set (0.00 sec)
2.3.2 修改字段的数据类型
ALTER TABLE语句的基本语法:
ALTER TABLE table_name MODIFY column_name new_data_type;
其中,table_name是要更改列数据类型的表的名称,column_name是要更改数据类型的列的名称,new_data_type是要为其指定的新数据类型。
现实需要注意,在有数据的情况下,更改类型的风险。
mysql> desc tab_07;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)mysql> alter table tab_07 modify name int;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tab_07;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | int | YES | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)mysql> alter table tab_07 modify name varchar(100);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tab_07;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(100) | YES | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)mysql>
2.3.3 修改字段名
ALTER TABLE语句的基本语法:
ALTER TABLE table_name CHANGE old_column_name new_column_name column_definition;
其中,table_name是要更改列名称的表的名称,old_column_name是要更改的现有列的名称,new_column_name是要为其指定的新名称,而column_definition是列类型和属性的定义,其中包括数据类型、约束和默认值。
mysql> alter table tab_07 change name new_name varchar(100);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tab_07;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| new_name | varchar(100) | YES | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
2.3.4 添加字端
ALTER TABLE语句的基本语法:
ALTER TABLE table_name ADD column_name column_definition;
其中,table_name是要添加新列的表的名称,column_name是新列的名称,column_definition是新列的数据类型和约束等定义。
mysql> alter table tab_07 add school varchar(50);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tab_07;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| new_name | varchar(100) | YES | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
| school | varchar(50) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
需要注意以下几点:
在执行添加新列的操作时,必须是具有足够权限的用户。
在添加新列时,可以指定数据类型、约束和默认值等定义,如果不指定,则会使用默认值或NULL。
添加新列时,如果不指定新列的位置,默认会将新列添加到表的最后。
如果需要在特定位置添加新列,则可以使用ALTER TABLE语句中的AFTER或BEFORE子句来指定新列的位置,例如:
mysql> alter table tab_07 add number varchar(50) after email;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tab_07;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| new_name | varchar(100) | YES | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
| number | varchar(50) | YES | | NULL | |
| password | varchar(50) | YES | | NULL | |
| school | varchar(50) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
2.3.5 删除字段
ALTER TABLE语句的基本语法:
ALTER TABLE table_name DROP column_name;
其中,table_name是要删除列的表的名称,column_name是要删除的列的名称。
mysql> alter table tab_07 drop number;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tab_07;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| new_name | varchar(100) | YES | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
| school | varchar(50) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
2.3.6 修改字段的排列位置
ALTER TABLE语句的基本语法:
ALTER TABLE table_name MODIFY column_name column_definition FIRST|AFTER column_name2;
其中,table_name是要修改列顺序的表的名称,column_name是要修改顺序的列的名称,column_definition是列的数据类型和约束等定义,FIRST和AFTER是指定列的新位置,column_name2是新位置的相邻列的名称。
mysql> alter table tab_07 modify school varchar(50) first;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tab_07;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| school | varchar(50) | YES | | NULL | |
| id | int | NO | PRI | NULL | |
| new_name | varchar(100) | YES | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)mysql> alter table tab_07 modify school varchar(50) after password;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc tab_07;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| new_name | varchar(100) | YES | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
| school | varchar(50) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)mysql>
2.3.7 更改表的存储引擎
ALTER TABLE语句的基本语法:
ALTER TABLE table_name ENGINE = engine_name;
其中,table_name是要修改存储引擎的表的名称,engine_name是要为表指定的存储引擎,例如: InnoDB, MyISAM, MEMORY, CSV 等。
ALTER TABLE tab_07 ENGINE = MyISAM;
需要注意以下几点:
当使用ALTER TABLE语句更改表的存储引擎时,必须确保新引擎已经安装。
在执行此操作之前,请确保备份数据,因为更改存储引擎可能会影响数据完整性。
不是所有的存储引擎都支持同一种特性、功能和约束条件。因此,必须谨慎选择存储引擎,以确保符合您的业务需求。
如果要为新表指定存储引擎,请在CREATE TABLE语句中指定,
CREATE TABLE students (...) ENGINE = InnoDB;
在创建新表时,可以通过指定ENGINE参数来指定表的存储引擎。
2.3.8 删除表的外键约束
删除表的外键约束的基本语法:
ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
其中,“表名” 是要删除外键的表的名称,“约束名” 是要删除的外键约束的名称。
ALTER TABLE tab_03 DROP FOREIGN KEY fk_emp_dept1;
2.4 删除表
2.4.1 删除没有关联的表
使用 DROP TABLE 语句来删除没有关联的表。以下是删除没有关联的表的基本语法:
DROP TABLE 表名1,表名2,... 表名n;
2.4.2 删除被其他表关联的主表
数据表存在外键关联的情况下,直接删除父表,会显示失败,原因是直接删除破坏表的参照完整性,如果必须要删除,可以先删除与他关联的子表,再删除父表,但是这样删除了两个表中的数据,如果要保存其中一个表的数据,可以将关联表的外键约束删除取消,这样皆可以了。
具体操作参照之前的步骤。