当前位置: 首页 > news >正文

【CS.DB】数据库-关系型数据库-MySQL-3.3.创建和管理表

1000.04.CS.DB-Database-Relational-MySQL-3.3.创建和管理表-Created: 2023-03-08.Thursday17:39

1. 创建和管理表

在 MySQL 中,创建和管理表是数据库操作的基础。以下是创建和管理表的主要步骤和方法。

1.1 定义表结构

定义表结构包括指定表的名称、列的名称和数据类型、主键和外键等。

示例:

CREATE TABLE example_table (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,description VARCHAR(100)
);

1.2 设置主键和外键

主键用于唯一标识表中的每一行记录,外键用于建立表之间的关系。

设置主键:

CREATE TABLE example_table (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL
);

设置外键:

CREATE TABLE orders (order_id INT PRIMARY KEY AUTO_INCREMENT,customer_id INT,FOREIGN KEY (customer_id) REFERENCES customers(id)
);

1.3 处理 NULL 值

在数据库设计和操作中,正确处理 NULL 值对于数据完整性和应用程序逻辑非常重要。

1.3.1 定义列时设置 NULLNOT NULL

在创建表时,可以指定列是否允许 NULL 值:

CREATE TABLE example_table (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,description VARCHAR(100) NULL
);
1.3.2 插入数据时处理 NULL

在插入数据时,未指定值的列会默认设置为 NULL(如果允许 NULL):

INSERT INTO example_table (name) VALUES ('Item 1');
-- description 列将被设置为 NULLmysql> SELECT * FROM example_table;
+----+--------+-------------+
| id | name   | description |
+----+--------+-------------+
|  1 | Item 1 | NULL        |
|  2 | Item 2 | NULL        |
+----+--------+-------------+
2 rows in set (0.02 sec)
1.3.3 ERROR 1138 (22004): Invalid use of NULL value : 更新数据中的 NULL

当尝试修改列定义为 NOT NULL 时,如果表中存在 NULL 值,MySQL 会抛出 ERROR 1138 (22004): Invalid use of NULL value 错误。为了避免此错误,需要先将所有 NULL 值更新为非 NULL 值,然后再修改列定义。

mysql> ALTER TABLE test_table MODIFY COLUMN description VARCHAR(100) NOT NULL;
ERROR 1138 (22004): Invalid use of NULL value

在修改列为 NOT NULL 之前,需要将现有的 NULL 值更新为非 NULL 值:

UPDATE example_table SET description = '' WHERE description IS NULL;
1.3.4 ERROR 1364 (HY000): Field 'description' doesn't have a default value : 修改列定义为 NOT NULL 并设置默认值

在将列设置为 NOT NULL 后,如果在插入数据时没有为该列提供值,则会出现 ERROR 1364 (HY000): Field 'description' doesn't have a default value 错误。这是因为该列不允许 NULL 值,并且没有默认值。

mysql> INSERT INTO test_table (name) VALUES ('Item 4'), ('Item 3');
ERROR 1364 (HY000): Field 'description' doesn't have a default value

为了避免插入数据时未指定列值导致的错误,可以在修改列为 NOT NULL 时设置默认值:

ALTER TABLE example_table MODIFY COLUMN description VARCHAR(100) NOT NULL DEFAULT '';
1.3.5 查询时处理 NULL

在查询时,可以使用 IFNULLCOALESCE 函数处理 NULL 值:

SELECT id, name, IFNULL(description, 'No Description') AS description FROM example_table;

or

SELECT id, name, IFNULL(description, '') AS description FROM example_table;
1.3.6 NULL 值的比较

在 SQL 中,使用 IS NULLIS NOT NULL 来检查 NULL 值,而不是使用等号:

SELECT * FROM example_table WHERE description IS NULL;
SELECT * FROM example_table WHERE description IS NOT NULL;

1.4 设置默认值

设置列的默认值可以确保在插入数据时未指定列值时,列会自动使用默认值。

示例:

CREATE TABLE example_table (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,description VARCHAR(100) NOT NULL DEFAULT 'No Description'
);

1.5 修改表结构

在实际应用中,可能需要修改表结构以适应业务需求的变化。可以使用 ALTER TABLE 语句来添加、删除或修改列。

添加列:

ALTER TABLE example_table ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

删除列:

ALTER TABLE example_table DROP COLUMN description;

修改列:

ALTER TABLE example_table MODIFY COLUMN name VARCHAR(100) NOT NULL;

2 实践举例

2.1 处理 NULL 值的方法

  1. 在 SQL 查询中处理 NULL
  2. 在代码中处理 NULL
2.1.1 在 SQL 查询中处理 NULL

在 SQL 查询中,可以使用 IFNULL 函数来替换 NULL 值。例如,可以将 NULL 值替换为空字符串:

SELECT F_channel, F_channel_error_code, IFNULL(F_channel_error_msg, '') AS F_channel_error_msg, F_inner_error_code, F_interface, F_strategy 
FROM lepay.t_channel_error_code_config;
2.1.2 在代码中处理 NULL

在代码中,应该检查 MYSQL_ROW 数组中的值是否为 NULL,而不是检查字符串 “NULL”。

MYSQL_ROW 是 MySQL C API 中定义的类型,通常通过 mysql.h 头文件引入。在 C++ 中处理 MySQL 数据库,可以使用 MySQL 提供的 C API 或者使用更高级的封装库如 mysql++

例如,在 C++ 中,可以手动检查 NULL 值。

std::string channelErrorMsg = (row[2] != nullptr) ? row[2] : "";  // 处理 NULL 值

References

  • https://dev.mysql.com/doc/
  • https://dev.mysql.com/doc/refman/8.0/en/data-types.html
  • https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【NPM】使用教程
  • Prometheus监控的搭建(ansible安装——超详细)
  • 力扣第五十七题——插入区间
  • STM32常见的下载方式有三种
  • PHP回调后门
  • 实验28.文件删除 sys_unlink
  • 微信小程序实战教程-1:京西购物商城实战
  • 【数据结构】B树
  • 【物联网】(指纹篇)在指纹录入的流程中,如何确保指纹信息的准确性?
  • 【星闪开发连载】WS63E开发板Windows环境的构建
  • Unity 输入模块 之 初识新输入系统(其实也不新)
  • Java高级Day26-绘制坦克大战
  • stm32入门学习13-时钟RTC
  • Ubuntu基础使用
  • Kylin系列(一)入门
  • [PHP内核探索]PHP中的哈希表
  • ERLANG 网工修炼笔记 ---- UDP
  • Hibernate【inverse和cascade属性】知识要点
  • Redis 中的布隆过滤器
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • swift基础之_对象 实例方法 对象方法。
  • 关于for循环的简单归纳
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 普通函数和构造函数的区别
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 全栈开发——Linux
  • 智能合约Solidity教程-事件和日志(一)
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​TypeScript都不会用,也敢说会前端?
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ### RabbitMQ五种工作模式:
  • #微信小程序:微信小程序常见的配置传值
  • $.proxy和$.extend
  • (ZT)出版业改革:该死的死,该生的生
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (二)Linux——Linux常用指令
  • (七)Activiti-modeler中文支持
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net core 6 集成和使用 mongodb
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .Net Web项目创建比较不错的参考文章
  • .net 连接达梦数据库开发环境部署
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET中的Exception处理(C#)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • /usr/bin/env: node: No such file or directory
  • @cacheable 是否缓存成功_Spring Cache缓存注解