1. 首页 > 国产数据库教程 > TiDB教程 > 正文

tidb教程FG015-TiDB数据库与表创建基础

本文档详细介绍TiDB数据库与表创建的基础知识,包括数据库设计、表设计、数据类型、创建方法等内容。风哥教程参考TiDB官方文档SQL语法相关内容,适合DBA和开发人员在日常使用TiDB时参考。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 数据库概念

数据库是存储和管理数据的集合,TiDB中的数据库概念与MySQL类似。

  • 数据库:存储表的容器
  • 模式:数据库的同义词,在TiDB中与数据库概念相同
  • 命名空间:数据库作为表的命名空间,确保表名在数据库内唯一
TiDB数据库特点:

  • 兼容MySQL语法
  • 支持多个数据库
  • 每个数据库有独立的权限控制

1.2 表概念

表是数据库中存储数据的基本单位,由行和列组成。

  • 表结构:由列定义组成,包括列名、数据类型、约束等
  • 行:表中的一条记录
  • 列:表中的一个字段
  • 约束:对表中数据的限制,如主键、外键、唯一约束等

1.3 数据类型

TiDB支持多种数据类型,与MySQL兼容。

1.3.1 数值类型

# 数值类型
– TINYINT: 1字节,范围 -128 到 127
– SMALLINT: 2字节,范围 -32768 到 32767
– MEDIUMINT: 3字节,范围 -8388608 到 8388607
– INT: 4字节,范围 -2147483648 到 2147483647
– BIGINT: 8字节,范围 -9223372036854775808 到 9223372036854775807
– FLOAT: 4字节,单精度浮点数
– DOUBLE: 8字节,双精度浮点数
– DECIMAL(M,D): 可变长度,精确小数

1.3.2 字符串类型

# 字符串类型
– CHAR(M): 固定长度字符串,最大长度255
– VARCHAR(M): 可变长度字符串,最大长度65535
– TEXT: 可变长度文本,最大长度65535
– MEDIUMTEXT: 可变长度文本,最大长度16777215
– LONGTEXT: 可变长度文本,最大长度4294967295
– BLOB: 二进制数据,最大长度65535
– MEDIUMBLOB: 二进制数据,最大长度16777215风哥提示:
– LONGBLOB: 二进制数据,最大长度4294967295

1.3.3 日期时间类型

# 日期时间类型
– DATE: 日期,格式 YYYY-MM-DD
– TIME: 时间,格式 HH:MM:SS
– DATETIME: 日期时间,格式 YYYY-MM-DD HH:MM:SS
– TIMESTAMP: 时间戳,格式 YYYY-MM-DD HH:MM:SS
– YEAR: 年份,格式 YYYY

1.3.4 其他类型

# 其他类型
– ENUM: 枚举类型
– SET: 集合类型
– JSON: JSON数据类型
– BIT: 位类型
风哥提示:选择合适的数据类型可以提高存储效率和查询性能。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 数据库设计

2.1.1 数据库命名

# 数据库命名规范
– 使用小写字母
– 使用下划线分隔单词
– 长度不超过64个字符
– 避免使用保留字
– 示例:fgedudb, fgedu_erp, fgedu_crm

2.1.2 数据库规划

# 数据库规划
– 按业务模块划分数据库
– 考虑数据量和访问频率
– 规划备份策略
– 规划权限管理
– 考虑数据隔离需求

2.2 表设计

2.2.1 表结构设计

# 表结构设计原则
– 遵循第三范式
– 合理选择数据类型
– 为每个表设置主键
– 合理设置索引
– 考虑数据增长

2.2.2 表命名

# 表命名规范
– 使用小写字母
– 使用下划线分隔单词
– 长度不超过64个字符
– 避免使用保留字
– 示例:fgedu_users, fgedu_orders, fgedu_products

2.2.3 列命名

# 列命名规范
– 使用小写字母
– 使用下划线分隔单词
– 长度不超过64个字符
– 避免使用保留字
– 示例:id, name, created_at, updated_at

2.3 命名规范

# 命名规范

## 1. 数据库命名
– 前缀:fgedu_
– 示例:fgedudb, fgedu_erp

## 2. 表命名
– 前缀:fgedu_
– 示例:fgedu_users, fgedu_orders

## 3. 列命名
– 主键:id
– 外键:[表名]_id
– 时间戳:created_at, updated_at
– 状态:status
学习交流加群风哥QQ113257174
## 4. 索引命名
– 主键索引:PRIMARY
– 唯一索引:uk_[列名]
– 普通索引:idx_[列名]
– 组合索引:idx_[列名1]_[列名2]

生产环境建议:制定统一的命名规范,提高代码可读性和可维护性。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 数据库创建

3.1.1 创建数据库

# 创建数据库

## 1. 基本语法
CREATE DATABASE [IF NOT EXISTS] database_name
[CHARACTER SET charset_name]
[COLLATE collation_name];

## 2. 示例
CREATE DATABASE IF NOT EXISTS fgedudb
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;

## 3. 查看数据库
SHOW DATABASES;

## 4. 选择数据库
USE fgedudb;

## 5. 删除数据库
DROP DATABASE IF EXISTS fgedudb;

3.1.2 数据库字符集

# 数据库字符集

## 1. 常用字符集
– utf8mb4: 支持四字节Unicode字符,包括emoji
– utf8: 支持三字节Unicode字符
– latin1: 单字节字符集

## 2. 字符集设置
CREATE DATABASE fgedudb CHARACTER SET utf8mb4;

## 3. 查看字符集
SHOW CREATE DATABASE fgedudb;

## 4. 修改字符集
ALTER DATABASE fgedudb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

3.2 表创建

3.2.1 创建表

# 创建表

## 1. 基本语法
CREATE TABLE [IF NOT EXISTS] table_name (
column1 data_type [constraints],
column2 data_type [constraints],

[PRIMARY KEY (column1, …)],
[UNIQUE KEY (column1, …)],
[INDEX (column1, …)],
[FOREIGN KEY (column1) REFERENCES table2 (column2)]
) [ENGINE=InnoDB] [DEFAULT CHARSET=utf8mb4] [COLLATE=utf8mb4_general_ci];

## 2. 示例
CREATE TABLE IF NOT EXISTS fgedu_users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT DEFAULT 0,
email VARCHAR(100) UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

## 3. 查看表结构
DESCRIBE fgedu_users;
SHOW CREATE TABLE fgedu_users;

## 4. 删除表
DROP TABLE IF EXISTS fgedu_users;

3.2.2 表约束

# 表约束

## 1. 主键约束
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,

);

## 2. 唯一约束
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE,

);

## 3. 非空约束
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,

);

## 4. 默认值约束
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
age INT DEFAULT 0,

);

## 5. 外键约束
CREATE TABLE fgedu_orders (
id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES fgedu_users (id) ON DELETE CASCADE ON UPDATE CASCADE,

);

3.3 索引创建

3.3.1 创建索引

# 创建索引

## 1. 主键索引
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,

);

## 2. 唯一索引
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE,

);

## 3. 普通索引
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
name VARCHAR(50),
INDEX idx_name (name),

);

## 4. 组合索引
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
INDEX idx_name_age (name, age),

);

## 5. 全文索引
CREATE TABLE fgedu_articles (
id INT PRIMARY KEY,
content TEXT,
FULLTEXT INDEX idx_content (content),

);

3.3.2 修改索引

# 修改索引

## 1. 添加索引
ALTER TABLE fgedu_users ADD INDEX idx_email (email);
ALTER TABLE fgedu_users ADD UNIQUE INDEX uk_email (email);

## 2. 删除索引
ALTER TABLE fgedu_users DROP INDEX idx_email;

## 3. 查看索引
SHOW INDEX FROM fgedu_users;

风哥提示:合理创建索引可以提高查询性能,但过多的索引会影响插入和更新性能。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 数据库创建实战案例

# 数据库创建实战案例

## 1. 连接到TiDB
$ mysql -h 192.168.1.401 -P 4000 -u root -p

## 2. 创建数据库
mysql> CREATE DATABASE IF NOT EXISTS fgedudb
-> CHARACTER SET utf8mb4
-> COLLATE utf8mb4_general_ci;

## 3. 查看数据库
mysql> SHOW DATABASES;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| sys |
| fgedudb |
+——————–+

## 4. 选择数据库
mysql> USE fgedudb;

## 5. 查看数据库信息
mysql> SHOW CREATE DATABASE fgedudb;
+———-+———————————————————————————————————————————-+
| Database | Create Database |
+———-+———————————————————————————————————————————-+
| fgedudb | CREATE DATABASE `fgedudb` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION=’N’ */ |
+———-+———————————————————————————————————————————-+

4.2 表创建实战案例

# 表创建实战案例

## 1. 创建用户表
mysql> CREATE TABLE IF NOT EXISTS fgedu_users (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(50) NOT NULL,
-> age INT DEFAULT 0,
-> email VARCHAR(100) UNIQUE,
-> phone VARCHAR(20),
-> address VARCHAR(255),
-> created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-> updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

## 2. 创建订单表
mysql> CREATE TABLE IF NOT EXISTS fgedu_orders (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> user_id INT,
-> order_no VARCHAR(32) UNIQUE,
-> amount DECIMAL(10,2) NOT NULL,
-> status VARCHAR(20) DEFAULT ‘pending’,
-> created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-> updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> FOREIGN KEY (user_id) REFERENCES fgedu_users (id) ON DELETE CASCADE ON UPDATE CASCADE
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

## 3. 创建产品表
mysql> CREATE TABLE IF NOT EXISTS fgedu_products (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(100) NOT NULL,
-> price DECIMAL(10,2) NOT NULL,
-> stock INT DEFAULT 0,
-> description TEXT,
-> created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-> updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

## 4. 创建订单详情表
mysql> CREATE TABLE IF NOT EXISTS fgedu_order_items (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> order_id INT,
-> product_id INT,
-> quantity INT NOT NULL,
-> price DECIMAL(10,2) NOT NULL,
-> created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-> FOREIGN KEY (order_id) REFERENCES fgedu_orders (id) ON DELETE CASCADE ON UPDATE CASCADE,
-> FOREIGN KEY (product_id) REFERENCES fgedu_products (id) ON DELETE CASCADE ON UPDATE CASCADE
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

## 5. 查看表结构
mysql> DESCRIBE fgedu_users;
+————+————–+——+—–+——————-+———————————————–+
| Field | Type | Null | Key | Default | Extra |
+————+————–+——+—–+——————-+———————————————–+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| age | int | YES | | 0 | |
| email | varchar(100) | YES | UNI | NULL | |
| phone | varchar(20) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
| created_at | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| updated_at | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+————+————–+——+—–+——————-+———————————————–+

4.3 表结构修改实战

# 表结构修改实战

## 1. 添加列
mysql> ALTER TABLE fgedu_users ADD COLUMN gender VARCHAR(10) DEFAULT ‘unknown’;

## 2. 修改列
mysql> ALTER TABLE fgedu_users MODIFY COLUMN age TINYINT DEFAULT 0;

## 3. 删除列
mysql> ALTER TABLE fgedu_users DROP COLUMN address;

## 4. 添加索引
mysql> ALTER TABLE fgedu_users ADD INDEX idx_name (name);
mysql> ALTER TABLE fgedu_orders ADD INDEX idx_user_id (user_id);

## 5. 修改表名
mysql> ALTER TABLE fgedu_products RENAME TO fgedu_goods;

## 6. 查看修改后的表结构
mysql> DESCRIBE fgedu_users;
+————+————–+——+—–+——————-+———————————————–+
| Field | Type | Null | Key | Default | Extra |
+————+————–+——+—–+——————-+———————————————–+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | MUL | NULL | |
| age | tinyint | YES | | 0 | |
| email | varchar(100) | YES | UNI | NULL | |
| phone | varchar(20) | YES | | NULL | |
| gender | varchar(10) | YES | | unknown | |
| created_at | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| updated_at | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+————+————–+——+—–+——————-+———————————————–+

## 7. 查看索引
mysql> SHOW INDEX FROM fgedu_users;
+————+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+—————+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+————+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+—————+
| fgedu_users | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
| fgedu_users | 0 | email | 1 | email | A | 0 | NULL | NULL | YES | BTREE | | |
| fgedu_users | 1 | idx_name | 1 | name | A | 0 | NULL | NULL | | BTREE | | |
+————+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+—————+

生产环境建议:在修改表结构时,特别是在生产环境中,需要注意操作的影响,避免影响系统正常运行。from tidb视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 最佳实践

TiDB数据库与表创建的最佳实践:

  • 数据库设计:按业务模块划分数据库,使用统一的命名规范
  • 表设计:遵循第三范式,合理选择数据类型,为每个表设置主键
  • 索引设计:根据查询需求创建索引,避免过多索引
  • 约束使用:合理使用约束确保数据完整性
  • 字符集:使用utf8mb4字符集,支持更广泛的字符
  • 存储引擎:使用InnoDB存储引擎
  • 权限管理:为不同用户设置适当的权限

5.2 性能优化技巧

# 性能优化技巧

## 1. 数据类型优化
– 使用最小的合适数据类型
– 避免使用TEXT和BLOB类型存储频繁查询的数据
– 使用DECIMAL存储精确小数
– 合理设置字段长度

## 2. 索引优化
– 为查询条件中的列创建索引
– 为排序和分组的列创建索引
– 避免在索引列上使用函数
– 合理使用组合索引
– 定期维护索引

## 3. 表结构优化
– 避免过多列
– 避免使用外键约束(考虑应用层实现)
– 合理使用分区表
– 考虑表的垂直拆分和水平拆分

## 4. 命名优化
– 使用有意义的表名和列名
– 遵循统一的命名规范
– 避免使用保留字

5.3 常见错误与解决

# 常见错误与解决

## 1. 数据类型选择错误
– 错误:使用INT存储小数值
– 解决:使用TINYINT或SMALLINT

## 2. 索引创建不当
– 错误:创建过多索引
– 解决:只创建必要的索引

## 3. 表结构设计不合理
– 错误:表列过多
– 解决:进行表的垂直拆分

## 4. 约束使用不当
– 错误:过度使用外键约束
– 解决:考虑在应用层实现约束

## 5. 命名不规范
– 错误:使用中文或特殊字符命名
– 解决:使用小写字母和下划线

## 6. 字符集设置错误
– 错误:使用latin1字符集
– 解决:使用utf8mb4字符集

风哥提示:合理的数据库和表设计是系统性能的基础,需要在设计阶段充分考虑业务需求和未来发展。

持续学习:数据库设计是一个不断优化的过程,建议定期回顾和优化表结构,以适应业务发展的需要。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息