当前位置: 首页 > 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

相关文章:

【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&#xff0c;1-100题每天分配10题&#xff0c;不会就先空着&#xff08;7&#xff09;。 1. 11&#xff1a;盛最多水的容器 class Solution:def maxArea(self, height: List[int]) -> int:res 0left 0right len(height) - 1while left < right:area (right…...

C语言整数溢出的问题

目录 补漏&#xff1a; 问题展现 解析 C的解决方案 补漏&#xff1a; 昨天我在开头提到-1的二进制如何表示&#xff0c;我在这里简单分析一下。 首先我们要明白有符号的数转换是需要补码的&#xff0c;所以我们想这个问题之前将补码的规则思考一遍&#xff08;首先将有符号…...

Linux学习之路 -- 进程 -- 进程间通信 -- 管道通信

本文主要介绍进程通信中的管道通信。 前面我们学习进程的过程中&#xff0c;我们知道&#xff0c;进程是具有独立性的。这也就导致了进程不能够直接地把数据进行传递。为了实现进程之间地通信&#xff0c;我们就需要通过另外地方式来实现进程之间数据地传递。 1.进程通信的目…...

GB/T 38082-2019 生物降解塑料购物袋检测

生物降解塑料购物袋是指以生物降解树脂为主要原料制得的&#xff0c;具有提携结构的&#xff0c;在销售、服务等场所用于盛装及携提商品的袋制品。 GB/T 38082-2019 生物降解塑料购物袋检测项目&#xff1a; 检测项目 测试标准 尺寸偏差 GB/T 38082 感官 GB/T 38082 提掉…...

docker数据卷和资源控制

目录 数据卷 实现数据卷 宿主机和容器之间进行数据共享 容器与容器之间进行数据共享 容器互联 docker容器的资源控制 cpu 1.设置cpu资源控制&#xff08;比重&#xff09; 2. 设置cpu的资源占用比&#xff08;权重&#xff09; 3.设置容器绑定cpu 内存 1.内存限制 …...

Kafka系统及其角色

Apache Kafka系统介绍 Apache Kafka 是由 LinkedIn 公司最初开发的一个高性能、分布式的消息传递系统。它被设计为一个可扩展、持久、分布式的流式处理平台&#xff0c;以满足 LinkedIn 在实时数据处理方面的需求 。Kafka 的诞生源于 LinkedIn 需要处理海量数据时现有消息队列系…...

从零开始构建霸王餐返利APP的技术路线与挑战

从零开始构建霸王餐返利APP的技术路线与挑战 大家好&#xff0c;我是阿可&#xff0c;微赚淘客系统及省赚客APP创始人&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在电商领域&#xff0c;霸王餐返利APP作为一种新兴的商业模式&#xff0c;为用…...

安装Jmeter,配置jdk

注意点: java的jdk和jmeter的版本相匹配 ! ! ! 目前我使用的是1.8的的,jmeter使用的是5.6.3 JDK下载地址&#xff1a;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 笔记 发现问题&#xff1a; 在any-to-any的转换中,由于内容和说话人音色的解耦不足,导致源说话人的音色部分仍保留在转换后的音频中&#x…...

机器学习(1)--数据可视化

文章目录 数据可视化作用可视化方法实现可视化 总结 数据可视化 数据可视化是将数据以图形、图像、动画等视觉形式表示出来&#xff0c;以便人们能够更直观地理解、分析和交流数据中的信息。 作用 一个整理的好好的数据&#xff0c;我们为什么要将其可视化呢&#xff1f;将它…...

docker部署Prometheus、Grafana

docker部署Prometheus 1、 拉取prometheus镜像 docler pull prom/prometheus 遇到问题&#xff1a;注意下科学上网。 2、将prometheus配置文件放在外面管理 prometheus.yml global:scrape_interval: 15sevaluation_interval: 15salerting:alertmanagers:- static_configs:-…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

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

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; 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映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

【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 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...