首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
5.1 MySQL存储引擎
5.1.1 MySQL存储引擎的概念
5.1.2 查询MySQL中支持的存储引擎
5.1.3 InnoDB存储引擎
5.1.4 MyISAM存储引擎
5.1.5 MEMORY存储引擎
5.1.6 选择存储引擎
5.1.7 设置数据表的存储引擎
5.2 MySQL数据类型
5.2.1 数字类型
5.2.2 字符串类型
5.2.3 日期和时间类型
6.1 创建数据表(CREATE TABLE语句)
6.2 查看表结构
6.2.1 使用SHOW COLUMNS语句查看
6.2.2 使用DESCRIBE语句查看
6.3 修改表结构(ALTER TABLE语句)
6.3.1 添加新字段和修改字段定义
6.3.2 修改字段名/类型
6.3.3 删除字段
6.3.4 修改表名
6.4 重命名表(RENAME TABLE语句)
6.5 复制表(CREATE TABLE…LIKE语句)
6.6 删除表(DROP TABLE语句)
7.1 运算符
7.1.1 算术运算符
7.1.2 比较运算符
7.1.3 逻辑运算符
7.1.4 位运算符
7.2 流程控制语句
7.2.1 IF语句
7.2.2 CASE语句
7.2.3 WHILE循环语句
7.2.4 LOOP循环语句
7.2.5 REPEAT循环语句
8.1 增添数据
8.1.1 使用INSERT…VALUES语句插入数据
8.1.2 使用INSERT…SET语句插入数据
8.1.3 使用INSERT...SELECT语句插入查询结果
8.2 修改数据
8.3 删除数据
8.3.1 使用DELETE语句删除数据
8.3.2 使用TRUNCATE TABLE语句删除数据
当前位置:
首页>>
技术小册>>
MySQL从入门到精通(二)
小册名称:MySQL从入门到精通(二)
### 8.1.2 使用`INSERT…SET`语句插入数据 在MySQL中,`INSERT`语句是向表中添加新行(记录)的基本方法。通常情况下,我们见到最多的是`INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...)`这样的语法形式,它直接指定了要插入数据的列和对应的值。然而,MySQL还提供了另一种灵活的方式来插入数据,即使用`INSERT…SET`语法。虽然这种语法在实际应用中不如`INSERT INTO…VALUES`常见,但它在特定场景下,如动态构建SQL语句或当你不确定所有列都需要被明确赋值时,显得尤为有用。 #### 8.1.2.1 `INSERT…SET`语法基础 `INSERT…SET`语句的基本语法如下: ```sql INSERT INTO table_name SET column1 = value1, column2 = value2, ...; ``` 这种语法与`INSERT INTO…VALUES`的主要区别在于,它不使用列名的列表来明确指定哪些列将被赋值,而是直接在`SET`子句中为每个列指定值。这种方式允许你以更自由的方式指定要插入的列和值,同时也便于在编程中动态构建SQL语句。 #### 8.1.2.2 使用场景 1. **动态列赋值**:当你不确定哪些列会被赋值时,使用`INSERT…SET`可以更加灵活地构建SQL语句。例如,在一个Web表单中,用户可能只填写了部分字段,使用`SET`可以仅针对这些已填写的字段进行插入操作。 2. **默认值处理**:对于未在`SET`子句中明确指定的列,如果它们有默认值,则MySQL会自动使用这些默认值。这在确保数据完整性的同时,也简化了插入操作。 3. **与编程语言的结合**:在编写程序时,尤其是动态生成SQL语句时,`INSERT…SET`语法可以更容易地根据程序逻辑来构建SQL语句,因为它允许以键值对的形式指定列和值。 #### 8.1.2.3 示例 假设我们有一个名为`employees`的表,其结构如下: ```sql CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), position VARCHAR(100), salary DECIMAL(10, 2), department_id INT, hire_date DATE DEFAULT CURRENT_DATE ); ``` 在这个表中,`id`是自动增长的主键,`hire_date`有一个默认值`CURRENT_DATE`,表示雇佣日期默认为当前日期。 **示例1:基本插入** ```sql INSERT INTO employees SET name = 'John Doe', position = 'Software Engineer', salary = 75000.00, department_id = 5; ``` 这条语句将插入一条新记录,其中`name`、`position`、`salary`和`department_id`被明确赋值,而`id`由于是自动增长的主键,MySQL会自动为其分配一个唯一的值。`hire_date`则使用了默认值,即当前日期。 **示例2:使用默认值** ```sql INSERT INTO employees SET name = 'Jane Smith', position = 'Product Manager'; ``` 在这个例子中,我们仅指定了`name`和`position`列的值。`salary`、`department_id`和`hire_date`将分别使用其默认值(如果`salary`和`department_id`没有默认值,则它们会被设置为NULL,除非表定义中指定了NOT NULL约束并提供了默认值)。 **示例3:动态构建SQL** 在编程中,特别是当使用脚本或应用程序动态构建SQL语句时,`INSERT…SET`的灵活性显得尤为重要。以下是一个伪代码示例,展示了如何根据用户输入动态构建`INSERT…SET`语句: ```python columns_to_set = [] values_to_set = [] # 假设这是从用户输入或表单数据中提取的 if user_name: columns_to_set.append('name') values_to_set.append(f"'{user_name}'") if user_position: columns_to_set.append('position') values_to_set.append(f"'{user_position}'") # ... 对其他字段进行类似处理 if columns_to_set: set_clause = ', '.join(f"{col} = {val}" for col, val in zip(columns_to_set, values_to_set)) sql = f"INSERT INTO employees SET {set_clause};" # 执行SQL语句(此处省略数据库连接和执行细节) ``` 注意:在实际应用中,应始终注意SQL注入的风险,特别是当使用动态构建的SQL语句时。上述示例中的字符串拼接方式并不安全,因为它没有处理用户输入中的特殊字符或恶意代码。在生产环境中,应使用参数化查询或ORM(对象关系映射)工具来安全地构建和执行SQL语句。 #### 8.1.2.4 注意事项 - **性能考虑**:虽然`INSERT…SET`提供了灵活性,但在某些情况下,它可能不如`INSERT INTO…VALUES`或批量插入(如`INSERT INTO…VALUES (...), (...)`)高效,特别是在插入大量数据时。 - **默认值与NOT NULL约束**:如果表定义中包含`NOT NULL`约束的列没有在`SET`子句中明确赋值,且这些列没有默认值,则插入操作将失败。 - **触发器与约束**:使用`INSERT…SET`时,也需要考虑数据库中的触发器、外键约束等可能对数据插入操作产生的影响。 总之,`INSERT…SET`是MySQL中一种灵活且强大的数据插入方式,尤其适用于需要根据条件动态构建SQL语句的场景。然而,在使用时也需要注意其潜在的性能影响以及安全性问题。
上一篇:
8.1.1 使用INSERT…VALUES语句插入数据
下一篇:
8.1.3 使用INSERT...SELECT语句插入查询结果
该分类下的相关小册推荐:
MySQL从入门到精通(五)
SQL零基础到熟练应用(增删改查)
MySQL8.0入门与实践
细说MySQL(零基础到高级应用)
MySQL 实战 45 讲
MySQL从入门到精通(三)
MySQL必会核心问题
MySQL从入门到精通(一)
MySQL从入门到精通(四)