一聚教程网:一个值得你收藏的教程网站

热门教程

MySQL如何使用CREATE TABLE创建业务表?

时间:2026-08-31 08:29:49 编辑:袖梨 来源:一聚教程网

必须先执行USE数据库,否则报错;建表需显式指定ENGINE=InnoDB、DEFAULT CHARSET=utf8mb4及COLLATE;字段应合理组合NOT NULL与DEFAULT;AUTO_INCREMENT须配合主键或唯一键;注释须位置正确且必要。

必须先 use 数据库,否则报错 ERROR 1046 (3D000): No database selected

MySQL 不允许在未选定数据库上下文时直接建表。你执行 CREATE TABLE users (...) 前,必须先运行 USE myapp_db;(把 myapp_db 换成你的真实库名)。这个步骤不是可选的——它决定了表最终落在哪个物理库目录下。漏掉这句,所有后续字段定义、引擎设置都无效,连错误提示都不会指向语法本身,容易误判。

ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 必须显式写

MySQL 8.0+ 虽默认用 InnoDB 和 utf8mb4,但线上环境不能依赖“默认”。老版本可能仍是 MyISAM,字符集可能是 latin1,存中文直接乱码;某些运维脚本或容器镜像还会覆盖全局配置。显式声明能锁死行为,避免迁移、备份还原或跨环境部署时出问题。

  1. ENGINE=InnoDB:支持事务、行锁、外键,业务表几乎都该用它
  2. DEFAULT CHARSET=utf8mb4:只有 utf8mb4 才真正支持 emoji 和生僻汉字(utf8 是别名,实际是 utf8mb3)
  3. COLLATE=utf8mb4_0900_ai_ci:MySQL 8.0+ 推荐的排序规则,大小写不敏感且带音调忽略(ai = accent insensitive)

字段定义里别漏掉 NOT NULL 和 DEFAULT 的组合陷阱

比如想让 status 字段默认为 'active',写成 status VARCHAR(20) DEFAULT 'active' 看似没问题,但如果没加 NOT NULL,插入时传 NULL 就真存进去了——而业务逻辑往往假设它总有值。反过来,加了 NOT NULL 却没设 DEFAULT,又会导致 INSERT 不带该字段时报错。

  1. 推荐模式:status VARCHAR(20) NOT NULL DEFAULT 'active'
  2. 时间字段用 CURRENT_TIMESTAMP 仅限 TIMESTAMPDATETIME 类型,INTVARCHAR 上写 DEFAULT NOW() 会直接报错
  3. AUTO_INCREMENT 必须配合 PRIMARY KEYUNIQUE KEY,单独写无效

表和字段注释要写,但 COMMENT 位置有讲究

字段注释必须紧跟在该字段定义末尾,写在括号里;表注释得放在整个语句最后,用 COMMENT='用户主表'。顺序错了 MySQL 会报语法错误,而不是忽略。

示例正确写法:

CREATE TABLE users (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',name VARCHAR(50) NOT NULL COMMENT '真实姓名',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户主表';

注释不是装饰,它是后期排查字段含义、生成文档、对接 ORM 的第一手依据。没注释的表,三个月后连你自己都得翻代码猜 flag1 是干啥的。

热门栏目