MySQL-表的基本操作(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL-表的基本操作

一、创建数据表


创建数据表是指在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性约束的过程。创建表之前应先使用语句{use 数据库名} 进入到指定的数据库,再执行表操作。

创建表

语法:

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

例:

创建bbs库并进入

1. mysql> create database bbs;
2. Query OK, 1 row affected (0.00 sec)
3. mysql> use bbs;
4. Database changed

创建test表,编号为int类型,姓名为varchar类型,部门为int类型,薪资为float类型。

int:整数 4个字节

varchar:可变字符串 0~65535

float:浮点数 4个字节

1. mysql> create table test(
2.     -> id int,
3.     -> name varchar(20),
4.     -> deptid int,
5.     -> salary float);
6. Query OK, 0 rows affected (0.02 sec)
7. mysql> show tables;
8. +---------------+
9. | Tables_in_bbs |
10. +---------------+
11. | test          |
12. +---------------+
13. 1 row in set (0.00 sec)

插入两行数据,下面有两种插入方式,第二种更加精确。但是如果未定义列值将出现null。

1. mysql> insert into test values(1,'zs',10,3000);
2. Query OK, 1 row affected (0.05 sec)
3. 
4. mysql> insert into test (id,name,deptid) values (2,'ls',20);
5. Query OK, 1 row affected (0.00 sec)
6. 
7. mysql> select * from test;
8. +------+------+--------+--------+
9. | id   | name | deptid | salary |
10. +------+------+--------+--------+
11. |    1 | zs   |     10 |   3000 |
12. |    2 | ls   |     20 |   NULL |
13. +------+------+--------+--------+
14. 2 rows in set (0.00 sec)

主键约束

主键约束要求:主键列的数据唯一,并且不允许为空。

(1)单字段主键

语法:

字段名 数据类型 PRIMARY KEY [默认值]

例:

创建file1表,定义id为主键。

1. mysql> create table file1(
2.     -> id int primary key,
3.     -> name varchar(20),
4.     -> deptid int,
5.     -> salary float);
6. Query OK, 0 rows affected (0.01 sec)

插入两行数据,主键id都为1,插入第二条数据时报错,表明id已存在不可重复。

1. mysql> insert into file1 values(1,'zs',10,3000);
2. Query OK, 1 row affected (0.01 sec)
3. 
4. mysql> insert into file1 values(1,'ls',20,3000);
5. ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

(2)在定义完所有列后指定主键

语法:

[CONSTRAINT <约束名>] PRIMARY KEY [字段名]

创建file2表,末尾定义主键。

1. mysql> create table file2(
2.     -> id int,
3.     -> name varchar(20),
4.     -> deptid int,
5.     -> salary float,
6.     -> PRIMARY KEY(id));
7. Query OK, 0 rows affected (0.01 sec)

插入两行数据,主键id都为1,插入第二条数据时报错,表明id已存在不可重复。

1. mysql> insert into file2 values(1,'zs',10,3000);
2. Query OK, 1 row affected (0.00 sec)
3. 
4. mysql> insert into file2 values(1,'ls',20,3000);
5. ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

(3)多字段联合主键

语法:

PRIMARY KEY [字段1,字段2,....]

创建file3表,末尾定义多主键。

1. mysql> create table file3(
2.     -> name varchar(20),
3.     -> deptid int,
4.     -> salary float,
5.     -> PRIMARY KEY(name,deptid));
6. Query OK, 0 rows affected (0.01 sec)

插入多行数据,主键为name和deptid,表示可以有多个“zs”或多个“10”,但是不能有两个姓名为“zs”并且部门为“10”。

1. mysql> insert into file3 values('zs',10,3000),('ls',20,4000),('ww',30,5000);
2. Query OK, 3 rows affected (0.00 sec)
3. Records: 3  Duplicates: 0  Warnings: 0
4. 
5. mysql> insert into file3 values('zs',40,6000);
6. Query OK, 1 row affected (0.00 sec)
7. 
8. mysql> insert into file3 values('ls',10,6000);
9. Query OK, 1 row affected (0.00 sec)
10. 
11. mysql> insert into file3 values('zs',10,6000);
12. ERROR 1062 (23000): Duplicate entry 'zs-10' for key 'PRIMARY'

外键约束

外键用来在两个表数据之间建立连接,它可以是一列或者多列。

语法:

[CONSTRAINT<外键名>] FOREIGN KEY [字段名1,字段名2...] REFERENCES<主表名> 主键列1[主键列2...]

创建两个表,外键名为dep_id,字段名为deptid,外键定义为dept1表中的id列。

1. mysql> create table dept1(
2.     -> id int PRIMARY KEY,
3.     -> name varchar(20) not null,
4.     -> location varchar(50));
5. Query OK, 0 rows affected (0.05 sec)
6. 
7. mysql> create table emp1(
8.     -> id int PRIMARY KEY,
9.     -> name varchar(20),
10.     -> deptid int,
11.     -> salary float,
12.     -> CONSTRAINT dep_id FOREIGN KEY(deptid) REFERENCES dept1(id));
13. Query OK, 0 rows affected (0.02 sec)

dept1表创建三行数据

1. mysql> insert into dept1 values(1,'zs','bj'),(2,'ls','hd'),(3,'ww','tz');
2. Query OK, 3 rows affected (0.01 sec)
3. Records: 3  Duplicates: 0  Warnings: 0

emp1表第一条数据创建正常,第二条创建失败(因为在dept1表中的id列没有“4”,所以emp1表deptid列创建不了。通俗点讲dept1表中的id列没有的数据,emp1表的deptid列就创建不了)。第三条创建成功。

1. mysql> insert into emp1 values(1,'zs',1,3000);
2. Query OK, 1 row affected (0.00 sec)
3. 
4. mysql> insert into emp1 values(2,'ls',4,3000);
5. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bbs`.`emp1`, CONSTRAINT `dep_id` FOREIGN KEY (`deptid`) REFERENCES `dept1` (`id`))
6. mysql> insert into emp1 values(2,'ls',3,3000);
7. Query OK, 1 row affected (0.00 sec)

非空约束

非空约束指字段的值不能为空。

语法:

字段名 数据类型 not null

例1:

创建test1表,姓名列不能为空。

1. mysql> create table test1(
2.     -> id int PRIMARY KEY,
3.     -> name varchar(20) NOT NULL,
4.     -> deptid int,
5.     -> salary float);
6. Query OK, 0 rows affected (0.02 sec)

插入数据,第一条全部插入成功,第二条除了name列全部插入,结果反馈"name"列报错。

1. mysql> insert into test1 values(1,'zs',10,3000);
2. Query OK, 1 row affected (0.01 sec)
3. 
4. mysql> insert into test1(id,deptid,salary) values(1,10,3000);
5. ERROR 1364 (HY000): Field 'name' doesn't have a default value

唯一约束

使用unique来指定列,表明为该列的唯一性,不可具有重复性。

语法:

[CONSTRATIN <约束名>] UNIQUE (<字段名>)

创建test2表,unique指定name列。

1. mysql> create table test2(
2.     -> id int PRIMARY KEY,
3.     -> name varchar(20),
4.     -> location varchar(50),
5.     -> CONSTRAINT STH UNIQUE(name));
6. Query OK, 0 rows affected (0.01 sec)

指定name列后,该列姓名不可具有同名。

1. mysql> insert into test2 values(1,'zs','bj');
2. Query OK, 1 row affected (0.00 sec)
3. 
4. mysql> insert into test2 values(2,'zs','hd');
5. ERROR 1062 (23000): Duplicate entry 'zs' for key 'sth'

默认约束

默认约束指定某列的默认值。

语法:

字段名 数据类型 DEFAULT 默认值

例:

创建test3表,指定deptid列默认为666。

1. mysql> create table test3(
2.     -> id int PRIMARY KEY,
3.     -> name varchar(20) NOT NULL,
4.     -> deptid int DEFAULT 666,
5.     -> salary float,
6.     -> info varchar(50));
7. Query OK, 0 rows affected (0.02 sec)

插入两行数据,除了deptid列,其他列都写入数据。而后查看test3表,deptid列默认的值都为666(默认状态为NULL)。

1. mysql> insert into test3(id,name,salary,info) values(1,'zs',3000,'bjcp');
2. Query OK, 1 row affected (0.00 sec)
3. 
4. mysql> insert into test3(id,name,salary,info) values(2,'ls',3000,'bjcp');
5. Query OK, 1 row affected (0.00 sec)
6. 
7. mysql> select * from test3;
8. +----+------+--------+--------+------+
9. | id | name | deptid | salary | info |
10. +----+------+--------+--------+------+
11. |  1 | zs   |    666 |   3000 | bjcp |
12. |  2 | ls   |    666 |   3000 | bjcp |
13. +----+------+--------+--------+------+
14. 2 rows in set (0.00 sec)

属性值自动增加

试想一下,id或与之类似的列,每次插入数据该列都需要输入。其值本身就需要递增,而如果自动添加将会省事很多,下面语句将解决这一问题。

语法:

字段名 数据类型 AUTO_INCREMENT

例:

创建test4表,指定id为主键、属性值自动增加。

1. mysql> create table test4(
2.     -> id int PRIMARY KEY AUTO_INCREMENT,
3.     -> name varchar(20) not null,
4.     -> deptid int,
5.     -> salary float);
6. Query OK, 0 rows affected (0.01 sec)

插入三行数据,指定插入name、salary。

1. mysql> insert into test4(name,salary) values('zs',1000),('ls',2000),('ww',3000);
2. Query OK, 3 rows affected (0.01 sec)
3. Records: 3  Duplicates: 0  Warnings: 0

查看id列自动添加值。

1. mysql> select * from test4;
2. +----+------+--------+--------+
3. | id | name | deptid | salary |
4. +----+------+--------+--------+
5. |  1 | zs   |   NULL |   1000 |
6. |  2 | ls   |   NULL |   2000 |
7. |  3 | ww   |   NULL |   3000 |
8. +----+------+--------+--------+
9. 3 rows in set (0.00 sec)

二、查看表结构


查看基本结构

语法:

DESCRIBE 表名; 或 DESC 表名;

例:

查看test1表结构。

1. mysql> describe test1;
2. +--------+-------------+------+-----+---------+-------+
3. | Field  | Type        | Null | Key | Default | Extra |
4. +--------+-------------+------+-----+---------+-------+
5. | id     | int(11)     | NO   | PRI | NULL    |       |
6. | name   | varchar(20) | NO   |     | NULL    |       |
7. | deptid | int(11)     | YES  |     | NULL    |       |
8. | salary | float       | YES  |     | NULL    |       |
9. +--------+-------------+------+-----+---------+-------+
10. 4 rows in set (0.02 sec)

或desc,两者查看的结果相同。

1. mysql> desc test1;
2. +--------+-------------+------+-----+---------+-------+
3. | Field  | Type        | Null | Key | Default | Extra |
4. +--------+-------------+------+-----+---------+-------+
5. | id     | int(11)     | NO   | PRI | NULL    |       |
6. | name   | varchar(20) | NO   |     | NULL    |       |
7. | deptid | int(11)     | YES  |     | NULL    |       |
8. | salary | float       | YES  |     | NULL    |       |
9. +--------+-------------+------+-----+---------+-------+
10. 4 rows in set (0.00 sec)

查看详细结构

语法:

SHOW CREATE TABLE <表名>;

例:

查看test1表的详细结构信息。

1. mysql> show create table test1;
2. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3. | Table | Create Table                                                                                                                                                                                               |
4. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
5. | test1 | CREATE TABLE `test1` (
6.   `id` int(11) NOT NULL,
7.   `name` varchar(20) NOT NULL,
8.   `deptid` int(11) DEFAULT NULL,
9.   `salary` float DEFAULT NULL,
10.   PRIMARY KEY (`id`)
11. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
12. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
13. 1 row in set (0.04 sec)


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
5月前
|
存储 SQL 关系型数据库
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
|
5月前
|
SQL 存储 数据库
MySQL设计规约问题之如何处理日志类型的表
MySQL设计规约问题之如何处理日志类型的表
|
6月前
|
存储 关系型数据库 MySQL
MySQL的一些基本操作
MySQL的一些基本操作
32 1
|
6月前
|
关系型数据库 MySQL
蓝易云 - 如何修复MySQL中损坏的表
最后,为了防止数据丢失,定期备份数据是非常重要的。
154 3
|
5月前
|
运维 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在处理MySQL表新增数据记录时,没有正确触发变更事件,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL 关系型数据库 MySQL
ClickHouse(23)ClickHouse集成Mysql表引擎详细解析
ClickHouse的MySQL引擎允许执行`SELECT`查询从远程MySQL服务器。使用`MySQL(&#39;host:port&#39;, &#39;database&#39;, &#39;table&#39;, &#39;user&#39;, &#39;password&#39;[,...])`格式连接,支持简单`WHERE`子句在MySQL端处理,复杂条件和`LIMIT`在ClickHouse端执行。不支持`NULL`值,用默认值替换。系列文章涵盖ClickHouse安装、集群搭建、表引擎解析等主题。[链接](https://zhangfeidezhu.com/?p=468)有更多
268 0
|
6月前
|
关系型数据库 MySQL 数据库
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
|
6月前
|
SQL 缓存 关系型数据库
MySQL操作全攻略:库、表、数据、事务全面指南
MySQL操作全攻略:库、表、数据、事务全面指南
|
6月前
|
SQL 关系型数据库 MySQL
经验大分享:MySQL(三)数据库表的查询操作【重要】
经验大分享:MySQL(三)数据库表的查询操作【重要】
67 0