【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 定义列时设置 NULL 或 NOT 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 值
在查询时,可以使用 IFNULL 或 COALESCE 函数处理 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 NULL 和 IS 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 值的方法
- 在 SQL 查询中处理
NULL值 - 在代码中处理
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
相关文章:
【CS.DB】数据库-关系型数据库-MySQL-3.3.创建和管理表
1000.04.CS.DB-Database-Relational-MySQL-3.3.创建和管理表-Created: 2023-03-08.Thursday17:39 1. 创建和管理表 在 MySQL 中,创建和管理表是数据库操作的基础。以下是创建和管理表的主要步骤和方法。 1.1 定义表结构 定义表结构包括指定表的名称、列的名称和数…...
Ceph分布式存储系统的搭建与使用
目录 一. 环境准备 二. 安装Docker 三. admin节点安装cephadm 四. admin节点给另外四个主机导入镜像 五. 向集群中添加节点 六. Ceph使用 列出可用设备 清除设备数据---针对有数据的设备 检查 OSD 状态 Ceph 集群中添加一个新的 OSD 查看集群的健康状态 指定MDS 列…...
通过Redsocks将Kali Linux的流量进行代理
Redsocks 是一个代理重定向工具,可以将流量通过 SOCKS 或 HTTP 代理传递。你可以使用它在 Kali Linux 中将流量通过代理服务器。以下是设置和使用 Redsocks 的步骤: 1. 安装 Redsocks Redsocks 通常在 Kali Linux 上不可用,需要手动安装。首…...
基于java五台山景点购票系统(源码+论文+部署讲解等)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优…...
基于springboot的网上服装商城
TOC springboot182基于springboot的网上服装商城 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性…...
QT、C++简单界面设计
#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {---------------------窗口设置----------------------this->setWindowTitle("南城贤子摄影工作室");//设置窗口标题this->setWindowIcon(QIcon("d:\\Pictures\\C…...
代码随想录算法训练营43期 | Day 10——栈与队列part1
代码随想录算法训练营 代码随想录算法训练营43期 | Day 10232.用栈实现队列225. 用队列实现栈20. 有效的括号1047.删除字符串中的所有相邻重复项 代码随想录算法训练营43期 | Day 10 232.用栈实现队列 class MyQueue { public:stack<int> sIn;stack<int> sOut;My…...
Java中常用的设计模式
一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程…...
leetcode 11-20(2024.08.15)
立个flag,1-100题每天分配10题,不会就先空着(7)。 1. 11:盛最多水的容器 class Solution:def maxArea(self, height: List[int]) -> int:res 0left 0right len(height) - 1while left < right:area (right…...
C语言整数溢出的问题
目录 补漏: 问题展现 解析 C的解决方案 补漏: 昨天我在开头提到-1的二进制如何表示,我在这里简单分析一下。 首先我们要明白有符号的数转换是需要补码的,所以我们想这个问题之前将补码的规则思考一遍(首先将有符号…...
Linux学习之路 -- 进程 -- 进程间通信 -- 管道通信
本文主要介绍进程通信中的管道通信。 前面我们学习进程的过程中,我们知道,进程是具有独立性的。这也就导致了进程不能够直接地把数据进行传递。为了实现进程之间地通信,我们就需要通过另外地方式来实现进程之间数据地传递。 1.进程通信的目…...
GB/T 38082-2019 生物降解塑料购物袋检测
生物降解塑料购物袋是指以生物降解树脂为主要原料制得的,具有提携结构的,在销售、服务等场所用于盛装及携提商品的袋制品。 GB/T 38082-2019 生物降解塑料购物袋检测项目: 检测项目 测试标准 尺寸偏差 GB/T 38082 感官 GB/T 38082 提掉…...
docker数据卷和资源控制
目录 数据卷 实现数据卷 宿主机和容器之间进行数据共享 容器与容器之间进行数据共享 容器互联 docker容器的资源控制 cpu 1.设置cpu资源控制(比重) 2. 设置cpu的资源占用比(权重) 3.设置容器绑定cpu 内存 1.内存限制 …...
Kafka系统及其角色
Apache Kafka系统介绍 Apache Kafka 是由 LinkedIn 公司最初开发的一个高性能、分布式的消息传递系统。它被设计为一个可扩展、持久、分布式的流式处理平台,以满足 LinkedIn 在实时数据处理方面的需求 。Kafka 的诞生源于 LinkedIn 需要处理海量数据时现有消息队列系…...
从零开始构建霸王餐返利APP的技术路线与挑战
从零开始构建霸王餐返利APP的技术路线与挑战 大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿! 在电商领域,霸王餐返利APP作为一种新兴的商业模式,为用…...
安装Jmeter,配置jdk
注意点: java的jdk和jmeter的版本相匹配 ! ! ! 目前我使用的是1.8的的,jmeter使用的是5.6.3 JDK下载地址:https://www.oracle.com/cn/java/technologies/downloads 别管,直接傻瓜式安装点点就完了... 1.电脑-属性-高级系统设置-环境变量 2.系统变量-新建-变量…...
Aria2@RPC下载@Alist批量下载
文章目录 abstractAria2 RPC 概述RPC 的主要功能在线文档aria2的配置文件与启动选项使用配置文件设置aria2 rpc功能Aria2关于rpc的离线文档 Aria2 RPC 重要和常用选项1. enable-rpc2. rpc-listen-port3. rpc-secret4. rpc-listen-all5. rpc-allow-origin-all6. rpc-max-request…...
神经串联式语音转换:对基于串联的单次语音转换方法的再思考 论文笔记
NEURAL CONCATENATIVE SINGING VOICE CONVERSION: RETHINKING CONCATENATION-BASED APPROACH FOR ONE-SHOT SINGING VOICE CONVERSION 笔记 发现问题: 在any-to-any的转换中,由于内容和说话人音色的解耦不足,导致源说话人的音色部分仍保留在转换后的音频中&#x…...
机器学习(1)--数据可视化
文章目录 数据可视化作用可视化方法实现可视化 总结 数据可视化 数据可视化是将数据以图形、图像、动画等视觉形式表示出来,以便人们能够更直观地理解、分析和交流数据中的信息。 作用 一个整理的好好的数据,我们为什么要将其可视化呢?将它…...
docker部署Prometheus、Grafana
docker部署Prometheus 1、 拉取prometheus镜像 docler pull prom/prometheus 遇到问题:注意下科学上网。 2、将prometheus配置文件放在外面管理 prometheus.yml global:scrape_interval: 15sevaluation_interval: 15salerting:alertmanagers:- static_configs:-…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
