网站首页 > 技术文章 正文
InnoDB使用 CREATE TABLE语句创建表;例如:
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
当InnoDB定义为默认存储引擎时,不需要ENGINE=InnoDB子句。但是, 如果要在默认存储引擎不存在或未知的不同 MySQL 服务器实例上重新执行CREATE TABLE语句,则ENGINE子句很有用 。您可以通过发出以下语句来确定 MySQL 服务器实例上的默认存储引擎:
mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB |
+--------------------------+
默认情况下,InnoDB表是在独立表空间中创建的。如果要InnoDB在系统表空间中创建表,请在创建表之前禁用innodb_file_per_table 变量。要在通用表空间中创建 InnoDB表,请使用 CREATE TABLE ... TABLESPACE语法。
行格式
InnoDB表的行格式决定了其行在磁盘上的物理存储方式。 InnoDB支持四种行格式,每种都有不同的存储特性。支持的行格式包括 REDUNDANT、COMPACT、 DYNAMIC和COMPRESSED。DYNAMIC格式是默认值。
innodb_default_row_format 变量定义了默认的行格式。也可以使用CREATE TABLE或者ALTER TABLE语句中的ROW_FORMAT中选项显式定义表的行格式。
主键
建议您为创建的每个表定义一个主键。选择主键列时,选择具有以下特征的列:
- 最重要的查询引用的列。
- 永远不会留空的列。
- 从不具有重复值的列。
- 插入后很少更改值的列。
例如,在包含人员信息的表中,您不会在姓名上创建主键。因为可以有多个人具有相同的姓名,姓名列可能留空,有时人们会更改姓名。由于有如此多的约束,通常没有一组明显的列可用作主键,因此您可以创建一个具有数字 ID 的新列作为主键的全部或部分。您可以声明一个自动增量列,以便在插入行时自动填充升序值:
# The value of ID can act like a pointer between related items in different tables.
CREATE TABLE t5 (id INT AUTO_INCREMENT, b CHAR (20), PRIMARY KEY (id));
# The primary key can consist of more than one column. Any autoinc column must come first.
CREATE TABLE t6 (id INT AUTO_INCREMENT, a INT, b CHAR (20), PRIMARY KEY (id,a));
尽管表可以在不定义主键的情况下正常工作,但主键涉及性能的许多方面,并且对于任何大型或经常使用的表来说都是至关重要的设计方面。建议您始终在CREATE TABLE语句中指定主键。如果您创建表,加载数据,然后运行 ALTER TABLE以添加主键,则该操作比创建表时定义主键要慢得多。
查看 InnoDB 表属性
要查看表的属性InnoDB,请使用以下SHOW TABLE STATUS 语句:
mysql> SHOW TABLE STATUS FROM test LIKE 't%' \G;
*************************** 1. row ***************************
Name: t1
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2021-02-18 12:18:28
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
您还可以通过查询INFORMATION_SCHEMA表来访问InnoDB表属性:
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G
*************************** 1. row ***************************
TABLE_ID: 1144
NAME: test/t1
FLAG: 33
N_COLS: 5
SPACE: 30
ROW_FORMAT: Dynamic
ZIP_PAGE_SIZE: 0
SPACE_TYPE: Single
INSTANT_COLS: 0
猜你喜欢
- 2025-07-02 mysql count(1)、count(*) 与 count (列名) 的执行区别
- 2025-07-02 非DBA原来是这样设计关系数据表的
- 2025-07-02 高并发下实现幂等的几种方式(高并发如何解决方案)
- 2025-07-02 [JPA教程]02.认识JPA的注解.md(jpa的@query注解)
- 2025-07-02 为啥不推荐使用外键?(什么情况下用外键)
- 2025-07-02 MYSQL存储引擎InnoDB(二):使用注意点
- 2025-07-02 MySQL数据库最常用操作(mysql常见操作)
- 2025-07-02 表格存储 SQL 查询多元索引(表格存储 sql 查询多元索引信息)
- 2025-07-02 雪花算法(雪花算法使用)
- 2025-07-02 MySQL的普通索引和唯一索引到底什么区别?
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 510℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 487℃MySQL service启动脚本浅析(r12笔记第59天)
- 467℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 465℃启用MySQL查询缓存(mysql8.0查询缓存)
- 445℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 424℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 421℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)