MySQL基本操作(续)

第3章:MySQL基本操作(续)

3.3 表操作

表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。

3.3.1 创建表

在MySQL中,使用CREATE TABLE语句创建新表。

基本语法
CREATE TABLE [IF NOT EXISTS] table_name (column1 datatype [constraints],column2 datatype [constraints],...,[table_constraints]
) [table_options];

参数说明:

  • IF NOT EXISTS:可选,如果表已存在,则不会创建新表,也不会报错
  • table_name:表名
  • column1, column2, ...:列名
  • datatype:列的数据类型
  • constraints:列级约束条件,如NOT NULL、UNIQUE等
  • table_constraints:表级约束条件,如PRIMARY KEY、FOREIGN KEY等
  • table_options:表选项,如存储引擎、字符集等
示例

创建基本表:

CREATE TABLE employees (id INT,first_name VARCHAR(50),last_name VARCHAR(50),email VARCHAR(100),hire_date DATE
);

创建带约束条件的表:

CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,first_name VARCHAR(50) NOT NULL,last_name VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,hire_date DATE NOT NULL,department_id INT,salary DECIMAL(10,2) DEFAULT 0.00,FOREIGN KEY (department_id) REFERENCES departments(id)
);

创建表时指定表选项:

CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,first_name VARCHAR(50) NOT NULL,last_name VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,hire_date DATE NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
从现有表创建新表

可以基于现有表的结构或查询结果创建新表:

-- 复制表结构(不包含数据)
CREATE TABLE new_employees LIKE employees;-- 基于查询结果创建表(包含数据)
CREATE TABLE senior_employees AS
SELECT * FROM employees WHERE hire_date < '2010-01-01';
临时表

临时表在会话结束时自动删除,对其他会话不可见:

CREATE TEMPORARY TABLE temp_employees (id INT,name VARCHAR(100)
);

3.3.2 查看表结构

MySQL提供了多种方法来查看表的结构和信息。

列出数据库中的表

使用SHOW TABLES命令列出当前数据库中的所有表:

SHOW TABLES;

输出示例:

+-------------------+
| Tables_in_mydb    |
+-------------------+
| departments       |
| employees         |
| projects          |
+-------------------+

可以使用LIKE子句筛选表名:

SHOW TABLES LIKE 'emp%';
查看表结构

使用DESCRIBEDESC命令查看表的列结构:

DESCRIBE employees;
-- 或
DESC employees;

输出示例:

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int          | NO   | PRI | NULL    | auto_increment |
| first_name  | varchar(50)  | NO   |     | NULL    |                |
| last_name   | varchar(50)  | NO   |     | NULL    |                |
| email       | varchar(100) | YES  | UNI | NULL    |                |
| hire_date   | date         | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
查看表的创建语句

使用SHOW CREATE TABLE命令查看创建表的完整SQL语句:

SHOW CREATE TABLE employees;

输出示例:

+------------+----------------------------------------------------+
| Table      | Create Table                                       |
+------------+----------------------------------------------------+
| employees  | CREATE TABLE `employees` (`id` int NOT NULL AUTO_INCREMENT,`first_name` varchar(50) NOT NULL,`last_name` varchar(50) NOT NULL,`email` varchar(100) DEFAULT NULL,`hire_date` date NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+------------+----------------------------------------------------+
查看表信息

使用INFORMATION_SCHEMA数据库查询表的详细信息:

-- 查询表的基本信息
SELECT TABLE_NAME, ENGINE, TABLE_ROWS, AVG_ROW_LENGTH,DATA_LENGTH, INDEX_LENGTH, TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'employees';-- 查询表的列信息
SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT,CHARACTER_SET_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'employees';

3.3.3 修改表

在MySQL中,使用ALTER TABLE语句修改现有表的结构。

添加列

向表中添加新列:

ALTER TABLE employees
ADD COLUMN phone VARCHAR(20);-- 在特定位置添加列
ALTER TABLE employees
ADD COLUMN address VARCHAR(200) AFTER email;-- 在第一列位置添加列
ALTER TABLE employees
ADD COLUMN employee_code VARCHAR(10) FIRST;
修改列

修改列的数据类型、约束或位置:

-- 修改列的数据类型
ALTER TABLE employees
MODIFY COLUMN phone VARCHAR(30);-- 修改列的数据类型和约束
ALTER TABLE employees
MODIFY COLUMN phone VARCHAR(30) NOT NULL DEFAULT '';-- 修改列的位置
ALTER TABLE employees
MODIFY COLUMN phone VARCHAR(30) AFTER last_name;
重命名列

MySQL 8.0及以上版本可以直接重命名列:

ALTER TABLE employees
RENAME COLUMN phone TO contact_number;

在旧版本中,需要使用CHANGE命令:

ALTER TABLE employees
CHANGE COLUMN phone contact_number VARCHAR(30);
删除列

从表中删除列:

ALTER TABLE employees
DROP COLUMN address;
添加约束

向表中添加约束:

-- 添加主键约束
ALTER TABLE employees
ADD PRIMARY KEY (id);-- 添加唯一约束
ALTER TABLE employees
ADD CONSTRAINT uk_email UNIQUE (email);-- 添加外键约束
ALTER TABLE employees
ADD CONSTRAINT fk_department
FOREIGN KEY (department_id) REFERENCES departments(id);-- 添加检查约束(MySQL 8.0.16及以上版本)
ALTER TABLE employees
ADD CONSTRAINT chk_salary CHECK (salary > 0);
删除约束

从表中删除约束:

-- 删除主键约束
ALTER TABLE employees
DROP PRIMARY KEY;-- 删除唯一约束
ALTER TABLE employees
DROP INDEX uk_email;-- 删除外键约束
ALTER TABLE employees
DROP FOREIGN KEY fk_department;-- 删除检查约束(MySQL 8.0.16及以上版本)
ALTER TABLE employees
DROP CONSTRAINT chk_salary;
修改表选项

修改表的存储引擎、字符集等选项:

-- 修改存储引擎
ALTER TABLE employees
ENGINE = MyISAM;-- 修改字符集和排序规则
ALTER TABLE employees
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;-- 修改表注释
ALTER TABLE employees
COMMENT = 'Employee information table';
重命名表

重命名表:

-- 方法1
ALTER TABLE employees
RENAME TO staff;-- 方法2
RENAME TABLE employees TO staff;

3.3.4 删除表

当不再需要某个表时,可以使用DROP TABLE语句将其删除。

基本语法
DROP TABLE [IF EXISTS] table_name [, table_name2, ...];

参数说明:

  • IF EXISTS:可选,如果表不存在,则不会报错
  • table_name:要删除的表名,可以同时删除多个表
示例

删除单个表:

DROP TABLE employees;

删除表(如果存在):

DROP TABLE IF EXISTS employees;

同时删除多个表:

DROP TABLE IF EXISTS employees, departments, projects;

警告DROP TABLE会永久删除表及其所有数据。此操作不可逆,执行前应确保有备份或确实不再需要该表。

截断表

如果只想删除表中的所有数据,但保留表结构,可以使用TRUNCATE TABLE

TRUNCATE TABLE employees;

TRUNCATE TABLEDELETE FROM更快,因为它不记录单个行删除操作,而是直接重新创建表。但它不能用于有外键约束的表,除非先禁用外键检查。

3.3.5 表的复制和备份

有时需要复制表结构或数据,用于测试、备份或数据迁移。

复制表结构

只复制表结构,不复制数据:

CREATE TABLE employees_backup LIKE employees;
复制表结构和数据

复制表结构和所有数据:

CREATE TABLE employees_backup AS
SELECT * FROM employees;

复制表结构和部分数据:

CREATE TABLE senior_employees AS
SELECT * FROM employees WHERE hire_date < '2010-01-01';
复制到现有表

将数据复制到已存在的表:

INSERT INTO employees_backup
SELECT * FROM employees;
使用mysqldump备份表

使用mysqldump命令行工具备份特定表:

# 备份单个表
mysqldump -u username -p database_name table_name > table_backup.sql# 备份多个表
mysqldump -u username -p database_name table1 table2 > tables_backup.sql

3.3.6 表的分区

表分区是将大表分成更小、更易管理的部分的技术。MySQL支持多种分区类型。

分区类型

MySQL支持以下分区类型:

  • RANGE:基于连续范围的分区
  • LIST:基于离散值列表的分区
  • HASH:基于哈希函数的分区
  • KEY:类似于HASH,但使用MySQL的内部哈希函数
创建分区表

使用RANGE分区创建表:

CREATE TABLE sales (id INT NOT NULL,sale_date DATE NOT NULL,amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(sale_date)) (PARTITION p0 VALUES LESS THAN (2020),PARTITION p1 VALUES LESS THAN (2021),PARTITION p2 VALUES LESS THAN (2022),PARTITION p3 VALUES LESS THAN (2023),PARTITION p4 VALUES LESS THAN MAXVALUE
);

使用LIST分区创建表:

CREATE TABLE employees (id INT NOT NULL,name VARCHAR(50),department VARCHAR(20)
)
PARTITION BY LIST (department) (PARTITION p_sales VALUES IN ('Sales', 'Marketing'),PARTITION p_tech VALUES IN ('IT', 'Engineering'),PARTITION p_admin VALUES IN ('HR', 'Finance', 'Admin')
);

使用HASH分区创建表:

CREATE TABLE orders (id INT NOT NULL,customer_id INT,order_date DATE
)
PARTITION BY HASH (id)
PARTITIONS 4;
管理分区

添加分区:

ALTER TABLE sales
ADD PARTITION (PARTITION p5 VALUES LESS THAN (2024));

删除分区:

ALTER TABLE sales
DROP PARTITION p0;

重组分区:

ALTER TABLE sales
REORGANIZE PARTITION p1, p2 INTO (PARTITION p12 VALUES LESS THAN (2022)
);

3.3.7 表的索引

索引是提高查询性能的重要工具。MySQL支持多种类型的索引。

创建索引

在创建表时添加索引:

CREATE TABLE employees (id INT NOT NULL,first_name VARCHAR(50),last_name VARCHAR(50),email VARCHAR(100),hire_date DATE,PRIMARY KEY (id),INDEX idx_name (first_name, last_name),UNIQUE INDEX idx_email (email)
);

在现有表上添加索引:

-- 添加普通索引
CREATE INDEX idx_hire_date ON employees (hire_date);-- 添加唯一索引
CREATE UNIQUE INDEX idx_email ON employees (email);-- 添加复合索引
CREATE INDEX idx_name ON employees (first_name, last_name);-- 使用ALTER TABLE添加索引
ALTER TABLE employees
ADD INDEX idx_department (department_id);
查看索引

查看表的所有索引:

SHOW INDEX FROM employees;
删除索引

删除索引:

-- 使用DROP INDEX
DROP INDEX idx_hire_date ON employees;-- 使用ALTER TABLE
ALTER TABLE employees
DROP INDEX idx_department;

3.4 数据类型

MySQL提供了多种数据类型,用于存储不同类型的数据。选择合适的数据类型对于优化存储空间和提高查询性能至关重要。

3.4.1 数值类型

MySQL支持所有标准SQL数值数据类型,包括精确数值类型和近似数值类型。

整数类型
数据类型存储空间最小值(有符号)最大值(有符号)最小值(无符号)最大值(无符号)
TINYINT1字节-1281270255
SMALLINT2字节-32,76832,767065,535
MEDIUMINT3字节-8,388,6088,388,607016,777,215
INT4字节-2,147,483,6482,147,483,64704,294,967,295
BIGINT8字节-9,223,372,036,854,775,8089,223,372,036,854,775,807018,446,744,073,709,551,615

使用示例:

-- 有符号整数
id INT,
small_value SMALLINT,
big_value BIGINT,-- 无符号整数
age TINYINT UNSIGNED,
population INT UNSIGNED,-- 指定显示宽度(不影响存储空间)
product_code INT(6) ZEROFILL

注意:在MySQL 8.0.17及以上版本中,整数类型的显示宽度属性已被弃用。

浮点和定点类型
数据类型存储空间精度范围说明
FLOAT4字节单精度,约7位数字近似值,可能有舍入误差
DOUBLE8字节双精度,约15位数字近似值,可能有舍入误差
DECIMAL(M,D)变长取决于M和D精确值,用于需要精确计算的场景

参数说明:

  • M:总位数(精度),最大值为65
  • D:小数位数(标度),最大值为30且不能大于M

使用示例:

-- 浮点类型
height FLOAT,
distance DOUBLE,-- 定点类型(精确值)
price DECIMAL(10,2),  -- 总共10位,其中2位小数
tax_rate DECIMAL(5,4)  -- 总共5位,其中4位小数

最佳实践:对于货币和需要精确计算的数值,应使用DECIMAL类型而非FLOATDOUBLE,以避免舍入误差。

位值类型

BIT(M)类型用于存储位值,其中M表示每个值的位数,范围从1到64。

使用示例:

flag BIT(1),  -- 可以存储0或1
options BIT(8)  -- 可以存储8位的值

3.4.2 字符串类型

MySQL提供了多种字符串类型,用于存储文本和二进制数据。

定长和变长字符串
数据类型最大长度存储特点适用场景
CHAR(M)255个字符固定长度,不足部分用空格填充长度固定或接近固定的短字符串
VARCHAR(M)65,535个字节可变长度,实际使用多少存多少长度可变的字符串

参数说明:

  • M:最大字符数,对于CHAR范围是0到255,对于VARCHAR最大可达65,535(受行大小限制)

使用示例:

-- 定长字符串
country_code CHAR(2),
state_code CHAR(2),-- 变长字符串
name VARCHAR(100),
address VARCHAR(255),
description VARCHAR(1000)

注意:实际可存储的最大长度受字符集影响。例如,utf8mb4字符集中,一个字符最多占4个字节,因此VARCHAR(1000)最多可存储约16,000个字节。

文本类型

对于大文本数据,MySQL提供了以下类型:

数据类型最大长度存储特点
TINYTEXT255个字节可变长度
TEXT65,535个字节可变长度
MEDIUMTEXT16,777,215个字节可变长度
LONGTEXT4,294,967,295个字节可变长度

使用示例:

comment TEXT,
article_content MEDIUMTEXT,
book_content LONGTEXT
二进制类型

对于二进制数据,MySQL提供了以下类型:

数据类型对应的字符串类型存储特点
BINARY(M)CHAR(M)固定长度二进制数据
VARBINARY(M)VARCHAR(M)可变长度二进制数据
TINYBLOBTINYTEXT最大255字节的二进制数据
BLOBTEXT最大65,535字节的二进制数据
MEDIUMBLOBMEDIUMTEXT最大16,777,215字节的二进制数据
LONGBLOBLONGTEXT最大4,294,967,295字节的二进制数据

使用示例:

file_data BLOB,
large_file_data LONGBLOB
枚举和集合类型

ENUMSET类型用于存储预定义的值列表:

数据类型特点最大值数量
ENUM(‘value1’, ‘value2’, …)只能从列表中选择一个值65,535
SET(‘value1’, ‘value2’, …)可以选择多个值的组合64

使用示例:

-- 枚举类型
status ENUM('active', 'inactive', 'suspended'),
gender ENUM('male', 'female', 'other'),-- 集合类型
permissions SET('read', 'write', 'execute', 'delete')

3.4.3 日期和时间类型

MySQL提供了多种日期和时间数据类型,用于存储时间相关的数据。

数据类型格式范围存储空间
DATE‘YYYY-MM-DD’‘1000-01-01’ 到 ‘9999-12-31’3字节
TIME‘HH:MM:SS’‘-838:59:59’ 到 ‘838:59:59’3字节
DATETIME‘YYYY-MM-DD HH:MM:SS’‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’8字节
TIMESTAMP‘YYYY-MM-DD HH:MM:SS’‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC4字节
YEAR‘YYYY’1901 到 21551字节

使用示例:

birth_date DATE,
appointment_time TIME,
created_at DATETIME,
last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
graduation_year YEAR
DATETIME与TIMESTAMP的区别
  • DATETIME:与时区无关,存储实际输入的日期和时间
  • TIMESTAMP:与时区有关,存储UTC时间,显示时会根据当前会话的时区进行转换
  • TIMESTAMP范围较小,但会自动更新(如果设置了ON UPDATE CURRENT_TIMESTAMP

3.4.4 JSON类型

MySQL 5.7.8及以上版本支持原生JSON数据类型,用于存储JSON(JavaScript Object Notation)文档。

使用示例:

CREATE TABLE products (id INT PRIMARY KEY,name VARCHAR(100),attributes JSON
);INSERT INTO products VALUES (1, 'Laptop', '{"color": "black", "weight": 1.5, "features": ["backlit keyboard", "touch screen"]}');

JSON类型提供了以下优势:

  • 自动验证JSON格式
  • 优化的存储格式
  • 使用JSON函数和运算符进行高效访问

访问JSON数据:

-- 使用->运算符(返回JSON值)
SELECT id, name, attributes->'$.color' AS color FROM products;-- 使用->>运算符(返回字符串值)
SELECT id, name, attributes->>'$.color' AS color FROM products;-- 访问数组元素
SELECT id, name, attributes->'$.features[0]' AS first_feature FROM products;

3.4.5 空间数据类型

MySQL支持空间数据类型,用于存储地理空间数据:

数据类型描述
GEOMETRY任何类型的空间值
POINT点(单个坐标)
LINESTRING线(多个点连接)
POLYGON多边形
MULTIPOINT多个点的集合
MULTILINESTRING多条线的集合
MULTIPOLYGON多个多边形的集合
GEOMETRYCOLLECTION多种空间对象的集合

使用示例:

CREATE TABLE locations (id INT PRIMARY KEY,name VARCHAR(100),location POINT
);INSERT INTO locations VALUES (1, 'Office', ST_GeomFromText('POINT(40.7128 -74.0060)'));

3.4.6 数据类型选择原则

选择合适的数据类型对于数据库性能和存储效率至关重要。以下是一些选择数据类型的原则:

  1. 使用最小满足需求的数据类型:例如,如果一个整数列的值永远不会超过127,使用TINYINT而不是INT

  2. 对于字符串,优先考虑VARCHAR而非CHAR:除非字符串长度几乎总是固定的。

  3. 对于大文本,使用适当的TEXT类型:根据预期的最大长度选择TEXTMEDIUMTEXTLONGTEXT

  4. 对于日期和时间

    • 只需要日期,使用DATE
    • 只需要时间,使用TIME
    • 需要日期和时间但不关心时区,使用DATETIME
    • 需要自动记录创建/修改时间且关心时区,使用TIMESTAMP
  5. 对于货币和精确计算:使用DECIMAL而不是FLOATDOUBLE

  6. 对于布尔值:使用TINYINT(1)BOOLEAN(实际上是TINYINT(1)的别名)。

  7. 对于枚举值:如果列只能取有限的几个值,考虑使用ENUM

  8. 对于二进制数据:小文件使用BLOB,大文件考虑存储文件路径而不是文件本身。

  9. 考虑索引限制:某些数据类型(如TEXT和BLOB)不能完全索引,只能使用前缀索引。

  10. 考虑存储空间和性能平衡:更小的数据类型通常意味着更好的性能,但不应以牺牲功能为代价。

3.5 约束条件

约束是对表中数据的限制,用于确保数据的准确性和一致性。MySQL支持多种类型的约束。

3.5.1 主键约束

主键唯一标识表中的每一行,每个表只能有一个主键。

创建主键

在创建表时定义主键:

-- 方法1:在列定义中指定
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);-- 方法2:使用表级约束
CREATE TABLE employees (id INT,name VARCHAR(100),PRIMARY KEY (id)
);-- 复合主键
CREATE TABLE order_items (order_id INT,product_id INT,quantity INT,PRIMARY KEY (order_id, product_id)
);

在现有表上添加主键:

ALTER TABLE employees
ADD PRIMARY KEY (id);
自动递增主键

使用AUTO_INCREMENT属性创建自动递增的主键:

CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100)
);

设置自动递增的起始值:

ALTER TABLE employees AUTO_INCREMENT = 1000;
删除主键

删除表的主键:

ALTER TABLE employees
DROP PRIMARY KEY;

注意:如果主键列是AUTO_INCREMENT,必须先移除AUTO_INCREMENT属性,然后才能删除主键。

3.5.2 唯一约束

唯一约束确保列或列组合中的所有值都是唯一的。

创建唯一约束

在创建表时定义唯一约束:

-- 方法1:在列定义中指定
CREATE TABLE employees (id INT PRIMARY KEY,email VARCHAR(100) UNIQUE
);-- 方法2:使用表级约束
CREATE TABLE employees (id INT PRIMARY KEY,email VARCHAR(100),UNIQUE KEY (email)
);-- 命名唯一约束
CREATE TABLE employees (id INT PRIMARY KEY,email VARCHAR(100),CONSTRAINT uk_email UNIQUE (email)
);-- 复合唯一约束
CREATE TABLE employees (id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),UNIQUE KEY (first_name, last_name)
);

在现有表上添加唯一约束:

ALTER TABLE employees
ADD CONSTRAINT uk_email UNIQUE (email);
删除唯一约束

删除唯一约束:

ALTER TABLE employees
DROP INDEX uk_email;

3.5.3 外键约束

外键约束用于维护表之间的引用完整性,确保一个表中的列值与另一个表中的列值匹配。

创建外键约束

在创建表时定义外键约束:

CREATE TABLE departments (id INT PRIMARY KEY,name VARCHAR(100)
);CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),department_id INT,FOREIGN KEY (department_id) REFERENCES departments(id)
);-- 命名外键约束
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),department_id INT,CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments(id)
);

在现有表上添加外键约束:

ALTER TABLE employees
ADD CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments(id);
外键约束选项

外键约束可以包含ON DELETEON UPDATE子句,指定当引用的行被删除或更新时的行为:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),department_id INT,FOREIGN KEY (department_id) REFERENCES departments(id)ON DELETE CASCADEON UPDATE CASCADE
);

可用的选项包括:

  • CASCADE:自动删除或更新相关行
  • SET NULL:将外键列设置为NULL
  • RESTRICT:阻止删除或更新(默认)
  • NO ACTION:类似于RESTRICT
  • SET DEFAULT:将外键列设置为默认值(InnoDB不支持)
删除外键约束

删除外键约束:

ALTER TABLE employees
DROP FOREIGN KEY fk_department;

3.5.4 非空约束

非空约束确保列不能包含NULL值。

创建非空约束

在创建表时定义非空约束:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100) NOT NULL,email VARCHAR(100) NOT NULL
);

在现有表上添加非空约束:

ALTER TABLE employees
MODIFY COLUMN name VARCHAR(100) NOT NULL;
删除非空约束

删除非空约束:

ALTER TABLE employees
MODIFY COLUMN name VARCHAR(100) NULL;

3.5.5 默认值约束

默认值约束为列指定默认值,当插入新行时如果未提供值,将使用默认值。

创建默认值约束

在创建表时定义默认值约束:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100) NOT NULL,status VARCHAR(20) DEFAULT 'active',hire_date DATE DEFAULT CURRENT_DATE()
);

在现有表上添加默认值约束:

ALTER TABLE employees
ALTER COLUMN status SET DEFAULT 'active';
删除默认值约束

删除默认值约束:

ALTER TABLE employees
ALTER COLUMN status DROP DEFAULT;

3.5.6 检查约束

检查约束(MySQL 8.0.16及以上版本支持)用于限制列中可接受的值范围。

创建检查约束

在创建表时定义检查约束:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT CHECK (age >= 18),salary DECIMAL(10,2) CHECK (salary > 0)
);-- 命名检查约束
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT,salary DECIMAL(10,2),CONSTRAINT chk_age CHECK (age >= 18),CONSTRAINT chk_salary CHECK (salary > 0)
);

在现有表上添加检查约束:

ALTER TABLE employees
ADD CONSTRAINT chk_age CHECK (age >= 18);
删除检查约束

删除检查约束:

ALTER TABLE employees
DROP CONSTRAINT chk_age;

3.5.7 生成列

生成列(MySQL 5.7及以上版本支持)是基于其他列的表达式自动计算的列。

创建生成列

在创建表时定义生成列:

-- 虚拟生成列(不存储,每次查询时计算)
CREATE TABLE rectangles (id INT PRIMARY KEY,width DECIMAL(10,2) NOT NULL,height DECIMAL(10,2) NOT NULL,area DECIMAL(20,4) AS (width * height) VIRTUAL
);-- 存储生成列(计算后存储,查询时不再计算)
CREATE TABLE rectangles (id INT PRIMARY KEY,width DECIMAL(10,2) NOT NULL,height DECIMAL(10,2) NOT NULL,area DECIMAL(20,4) AS (width * height) STORED
);

在现有表上添加生成列:

ALTER TABLE rectangles
ADD COLUMN perimeter DECIMAL(20,4) AS (2 * (width + height)) VIRTUAL;

3.5.8 约束命名约定

为约束命名可以使维护更容易,特别是在需要删除或修改约束时。以下是一些常用的命名约定:

  • 主键:pk_表名pk_列名
  • 唯一约束:uk_表名_列名uk_列名
  • 外键:fk_当前表_引用表fk_当前列_引用列
  • 检查约束:chk_表名_列名chk_列名_规则

例如:

CREATE TABLE orders (id INT,customer_id INT,order_date DATE,total DECIMAL(10,2),CONSTRAINT pk_orders PRIMARY KEY (id),CONSTRAINT uk_orders_reference UNIQUE (reference_number),CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers(id),CONSTRAINT chk_orders_total CHECK (total > 0)
);

通过合理使用约束条件,可以确保数据库中的数据符合业务规则,提高数据的准确性和一致性。约束条件是数据库设计中的重要组成部分,应该在设计阶段就仔细考虑和规划。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索未知惊喜,盲盒抽卡机小程序系统开发新启航

在消费市场不断追求新鲜感与惊喜体验的当下&#xff0c;盲盒抽卡机以其独特的魅力&#xff0c;迅速成为众多消费者热衷的娱乐与消费方式。我们紧跟这一潮流趋势&#xff0c;专注于盲盒抽卡机小程序系统的开发&#xff0c;致力于为商家和用户打造一个充满趣味与惊喜的数字化平台…

89.实现添加收藏的功能的后端实现

实现完查看收藏列表之后&#xff0c;实现的是添加收藏的功能 我的设想是&#xff1a;在对话界面中&#xff0c;如果用户认为AI的回答非常好&#xff0c;可以通过点击该回答对应的气泡中的图标&#xff0c;对该内容进行添加 所以后端实现为&#xff1a; service类中添加&…

OD 算法题 B卷【猴子吃桃】

文章目录 猴子吃桃 猴子吃桃 猴子喜欢吃桃&#xff0c;桃园有N棵桃树&#xff0c;第i棵桃树上有Ni个桃&#xff0c;看守将在H(>N)小时后回来&#xff1b;猴子可以决定吃桃的速度K(个/小时)&#xff0c;每个小时他会选择一棵桃树&#xff0c;从中吃掉K个桃&#xff0c;如果这…

ubuntu 端口复用

需求描述&#xff1a;复用服务器的 80端口&#xff0c;同时处理 ssh 和 http 请求&#xff0c;也就是 ssh 连接和 http 访问服务器的时候都可以指定 80 端口&#xff0c;然后服务器可以正确分发请求给 ssh 或者 http。 此时&#xff0c;ssh 监听的端口为 22&#xff0c;而 htt…

Hive中ORC存储格式的优化方法

优化Hive中的ORC(Optimized Row Columnar)存储格式可显著提升查询性能、降低存储成本。以下是详细的优化方法,涵盖参数配置、数据组织、写入优化及监控调优等维度: 一、ORC核心参数优化 1. 存储与压缩参数 SET orc.block.size=268435456; -- 块大小(默认256MB)…

Vim 设置搜索高亮底色

在 Vim 中&#xff0c;默认搜索命中会高亮显示&#xff0c;方便用户快速定位关键字。但有些用户希望自定义搜索匹配的底色或前景色&#xff0c;以适应不同的配色方案或提高可读性。本文将详细介绍如何修改 Vim 的搜索高亮颜色。 一、Vim 搜索高亮机制 Vim 用内置的高亮组&…

【计算机网络】非阻塞IO——poll实现多路转接

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a;【计算机网络】非阻塞IO——select实现多路转接 &#x1f516;流水不争&#xff0c;争的是滔滔不息 一、…

vscode使用系列之快速生成html模板

一.欢迎来到我的酒馆 vscode&#xff0c;yyds! 目录 一.欢迎来到我的酒馆二.vscode下载安装1.关于vscode你需要知道2.开始下载安装 三.vscode快速创建html模板 二.vscode下载安装 1.关于vscode你需要知道 Q&#xff1a;为什么使用vscode? A&#xff1a;使用vscode写…

【C/C++】不同防止头文件重复包含的措施

文章目录 #pragma once vs #ifndef 文件宏1 原理层面区别&#xff08;core&#xff09;2 关键区别与优缺点分析3 总结与最佳实践 #pragma once vs #ifndef 文件宏 在 C/C 中&#xff0c;#pragma once 和传统的文件宏守卫 (#ifndef HEADER_H #define HEADER_H ... #endif) 都用…

java-springboot文件上传校验之只允许上传excel文件,且检查不能是脚本或者有害文件或可行性文件

四重验证机制&#xff1a; 文件扩展名检查&#xff08;.xlsx/.xls&#xff09;MIME类型检查文件魔数验证&#xff08;真实文件类型&#xff09;可执行文件特征检测 防御措施&#xff1a; 使用try-with-resources确保流关闭限制文件大小防止DoS攻击使用Apache POI的FileMagic进…

不确定性分析在LEAP能源-环境系统建模中的整合与应用

本内容突出与实例结合&#xff0c;紧密结合国家能源统计制度及《省级温室气体排放编制指南》&#xff0c;深入浅出地介绍针对不同级别研究对象时如何根据数据结构、可获取性、研究目的&#xff0c;构建合适的能源生产、转换、消费、温室气体排放&#xff08;以碳排放为主&#…

高性能分布式消息队列系统(四)

八、客户端模块的实现 客户端实现的总体框架 在 RabbitMQ 中&#xff0c;应用层提供消息服务的核心实体是 信道&#xff08;Channel&#xff09;。 用户想要与消息队列服务器交互时&#xff0c;通常不会直接操作底层的 TCP 连接&#xff0c;而是通过信道来进行各种消息的发布…

QPair 类说明

QPair 类说明 QPair 是一个模板类&#xff0c;用于存储一对数据项。 头文件&#xff1a; cpp #include <QPair> qmake 配置&#xff1a; QT core 所有成员列表&#xff08;包括继承成员&#xff09; 公共类型 类型定义说明first_type第一个元素的类型&#xff…

4.大语言模型预备数学知识

大语言模型预备数学知识 复习一下在大语言模型中用到的矩阵和向量的运算&#xff0c;及概率统计和神经网络中常用概念。 矩阵的运算 矩阵 矩阵加减法 条件&#xff1a;行数列数相同的矩阵才能做矩阵加减法 数值与矩阵的乘除法 矩阵乘法 条件&#xff1a;矩阵A的列数 矩阵…

uniapp 设置手机不息屏

在使用 UniApp 开发应用时&#xff0c;有时需要在设备长时间未操作时实现息屏保护功能&#xff0c;以节省电量和保护屏幕。以下是如何在 UniApp 中实现这一功能的步骤。 示例一 // 保持屏幕常亮 uni.setKeepScreenOn({keepScreenOn: true });// 监听应用进入后台事件 uni.onH…

智能推荐系统:协同过滤与深度学习结合

智能推荐系统&#xff1a;协同过滤与深度学习结合 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 智能推荐系统&#xff1a;协同过滤与深度学习结合摘要引言技术原理对比1. 协同过滤算法&#xff1a;基于相似性的推…

使用Python和OpenCV实现图像识别与目标检测

在计算机视觉领域&#xff0c;图像识别和目标检测是两个非常重要的任务。图像识别是指识别图像中的内容&#xff0c;例如判断一张图片中是否包含某个特定物体&#xff1b;目标检测则是在图像中定位并识别多个物体的位置和类别。OpenCV是一个功能强大的开源计算机视觉库&#xf…

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…

Splash动态渲染技术全解析:从基础到企业级应用(2025最新版)

引言 在Web 3.0时代&#xff0c;87%的网站采用JavaScript动态渲染技术。传统爬虫难以应对Ajax加载、SPA应用等场景&#xff0c;Splash作为专业的JavaScript渲染服务&#xff0c;凭借​​Lua脚本控制​​和​​异步处理能力​​&#xff0c;已成为动态数据抓取的核心工具。本文…