myslq有条件插入数据

本文探讨在并发环境中如何生成唯一管理号并处理冲突,通过引用实例展示MySQL语句在实现唯一性验证与冲突解决过程中的应用。讨论了并发处理、数据库操作中的锁机制及其在确保数据一致性方面的角色。

要求是这样的:

我有一个表存着基础数据有一个字段是 管理号 我的目的是先查询最新的管理号按照规则生成新管理号 然后insert到表里新数据  由于查询并不锁表 所以在查询到insert这步中间会有可能两线程查询到相同的管理号?

参考了http://www.jb51.net/article/26934.htm

关键是如下的MYSQL语句,

插入多条记录:

 
INSERT INTO clients 
(client_id, client_name, client_type) 
SELECT supplier_id, supplier_name, 'advertising' 
FROM suppliers 
WHERE not exists (select * from clients 
where clients.client_id = suppliers.supplier_id); 

插入单条记录:

 
INSERT INTO clients 
(client_id, client_name, client_type) 
SELECT 10345, 'IBM', 'advertising' 
FROM dual 
WHERE not exists (select * from clients 
where clients.client_id = 10345); 

所以在插入时可以检测管理号存在不存在,插入若不成功则取出目前的最新管理号,重新计算后再插入,直至成功。


这种情况很多的,比如火车、影院售票等,由于并发处理量很大,往往查询到有票的,但实际下单时此票已售出,不知道这些系统是如何处理的。


### 3.3 插入数据的方法和语法 MySQL 提供多种方式向数据表中插入数据,主要包括 `INSERT INTO`、`REPLACE INTO` 等语句,适用于不同的业务场景。 #### 3.3.1 使用 `INSERT INTO` 插入数据 `INSERT INTO` 是最常用的插入数据方法,用于将新记录插入到指定表中。基本语法如下: ```sql INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...); ``` 例如,向表 `users` 中插入一条记录: ```sql INSERT INTO users (name, age, email) VALUES ('Alice', 25, 'alice@example.com'); ``` 如果插入的值顺序与表中字段顺序一致,可以省略字段名: ```sql INSERT INTO users VALUES (NULL, 'Bob', 30, 'bob@example.com'); ``` 需要注意的是,如果插入数据违反了主键或唯一索引约束,插入操作会失败,并抛出错误[^1]。 #### 3.3.2 使用 `REPLACE INTO` 插入或替换数据 `REPLACE INTO` 是 MySQL 特有的扩展语句,用于在插入数据时处理主键或唯一索引冲突的情况。其语法如下: ```sql REPLACE INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...); ``` 例如,当插入数据与已有主键冲突时,`REPLACE INTO` 会先删除旧记录,再插入新记录: ```sql REPLACE INTO users (id, name, age, email) VALUES (1, 'Charlie', 28, 'charlie@example.com'); ``` 如果 `id = 1` 的记录已存在,则会被删除并替换为新记录。这种方式适用于需要确保数据唯一性并自动更新的场景[^1]。 #### 3.3.3 使用 `INSERT INTO ... ON DUPLICATE KEY UPDATE` 更新或插入数据 该语句是另一种处理主键或唯一索引冲突的方法,语法如下: ```sql INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...) ON DUPLICATE KEY UPDATE column2 = value2, column3 = value3, ...; ``` 例如: ```sql INSERT INTO users (id, name, age, email) VALUES (1, 'David', 22, 'david@example.com') ON DUPLICATE KEY UPDATE name = 'David', age = 22, email = 'david@example.com'; ``` 如果 `id = 1` 的记录已存在,则不会删除整条记录,而是根据指定字段进行更新。这种方式在需要保留部分旧数据并更新部分字段时非常有用。 #### 3.3.4 批量插入数据 MySQL 支持一次插入多条记录,以提高插入效率。语法如下: ```sql INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...), (value4, value5, value6, ...), ...; ``` 例如: ```sql INSERT INTO users (name, age, email) VALUES ('Eve', 29, 'eve@example.com'), ('Frank', 35, 'frank@example.com'), ('Grace', 27, 'grace@example.com'); ``` 这种方式适用于需要一次性导入大量数据的场景,可以显著减少数据库交互次数。 #### 3.3.5 从查询结果插入数据 还可以将查询结果插入到目标表中,语法如下: ```sql INSERT INTO table_name (column1, column2, column3, ...) SELECT column1, column2, column3, ... FROM source_table WHERE condition; ``` 例如,将 `temp_users` 表中符合条件数据插入到 `users` 表中: ```sql INSERT INTO users (name, age, email) SELECT name, age, email FROM temp_users WHERE age > 18; ``` 这种方式适用于从临时表或其他表中迁移数据的场景。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值