mysql添加数据之前判断是否存在

本文介绍MySQL中利用NOT EXISTS子句实现有条件插入的方法,并展示了如何通过预置数据初始化数据库表。具体包括基本配置、角色预置、用户及权限设置等。

mysql支持直接写sql语句做判断,通过查询表数据是否存在,不存在则执行插入操作

示例:

 INSERT INTO tb_news_topic(title,summary) SELECT '218', 
'XQ33019920170811142528217' FROM DUAL WHERE NOT EXISTS(SELECT * 
FROM tb_news_topic WHERE title = '111')

语法:

INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 
'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM 
table WHERE field = ?)

批量操作:
通过foreach遍历数组的时候,foreach里面不能使用await ,所在这个地方我用的for循环对数组进行遍历

for (let i = 0; i < list.data.length;i++){
    let sql = `INSERT INTO tb_news_topic(title,summary,url,topic_order,publishDate,createdAt) SELECT ?, 
?,?,?,?,? FROM DUAL WHERE NOT EXISTS(SELECT * 
FROM tb_news_topic WHERE title = ?)`
      // 直接执行sql语句
      const results = await this.app.mysql.query(sql, [list.data[i].title, 
        list.data[i].summary, 
        '',
        list.data[i].order, 
        new Date(list.data[i].publishDate), 
        this.app.mysql.literals.now,//当前时间
        list.data[i].title
      ]);
 }

预置数据

– 基础数据baseConfig
INSERT IGNORE INTO hlms_toc_basic_config(id,tenant_id,code,name,group,type,value,description)(select (#{tenantId} * 1000000) + id,#{tenantId},code,name,bc.group,type,value,description from hlms_toc_basic_config bc where bc.tenant_id=0);

– 角色预置超级管理员
INSERT IGNORE INTO hlms_toc_role(id, role_name, tenant_id, group_id, role_code, b_default, b_limit, disabled, description, create_by, create_time, last_modified_by, last_modified_time) (SELECT (#{tenantId} * 1000000) + id, role_name, #{tenantId}, group_id, role_code, b_default, b_limit, disabled, description, create_by, create_time, last_modified_by, now() from hlms_toc_role where tenant_id=0);

– 预置admin 用户
insert IGNORE into hlms_toc_user(id,tenant_id,login_name,real_name,password,contact,create_by,create_time,last_modified_by,last_modified_time,pwd_strength,status,is_delete,pwd_modify_time )
(SELECT (#{tenantId}*1000000)+id,#{tenantId},login_name,real_name,password,contact,create_by,create_time,last_modified_by,last_modified_time,pwd_strength,status,is_delete,DATE_SUB(now(),INTERVAL -30 DAY) from hlms_toc_user where tenant_id=0);

– 预置用户角色
insert IGNORE into hlms_toc_user_role(user_id,role_id,tenant_id,disabled,create_by,create_time)(select (#{tenantId}*1000000)+user_id,(#{tenantId}*1000000)+role_id,#{tenantId},disabled,create_by,create_time from hlms_toc_user_role where tenant_id=0 );

– 预置 应用
INSERT IGNORE INTO hlms_toc_permission_application(id,name,tenant_id,group_id,code,source,status,suite_id, sys_url,serial_no,description,create_by,create_time,last_modified_by,last_modified_time) (select (#{tenantId}*100000)+id,name,#{tenantId},(#{tenantId}*100000)+group_id,code,source,status,suite_id, sys_url,serial_no,description,create_by,create_time,last_modified_by,now() from hlms_toc_permission_application where tenant_id=0);

– 预置应用扩展表
INSERT IGNORE INTO hlms_toc_permission_application_form(id,application_id,form,icon_url,portal_url,unique_code)
(select (#{tenantId}*1000000)+af.id,(#{tenantId}*1000000)+af.application_id,af.form,af.icon_url,af.portal_url,af.unique_code from hlms_toc_permission_application_form af left join
hlms_toc_permission_application pa on pa.id=af.application_id
where pa.tenant_id=0);

– 功能
INSERT IGNORE INTO hlms_toc_permission_function (id,tenant_id,form_id,parent_id,code,name,status,url,description,unique_code)(select (#{tenantId}*1000000)+id,#{tenantId},(#{tenantId}*1000000)+form_id,parent_id,code,name,status,url,description,unique_code from hlms_toc_permission_function where tenant_id=0);

– 功能按钮
INSERT IGNORE INTO hlms_toc_permission_button (id,tenant_id,function_id,code,name,status,unique_code,is_show,ask_url)(select (#{tenantId}*1000000)+id,#{tenantId},(#{tenantId}*1000000)+function_id,code,name,status,unique_code,is_show,ask_url from hlms_toc_permission_button where tenant_id=0);

– 预置角色 配置功能权限
INSERT IGNORE INTO hlms_toc_role_permission(tenant_id,role_id,permission_id,code,type,url)
(select (#{tenantId}*1000000)+tenant_id,(#{tenantId}*1000000)+role_id,(#{tenantId}*1000000)+permission_id,code,type,url from hlms_toc_role_permission where tenant_id=0);

</insert>
<think> 嗯,用户这次问的是MySQL判断数据是否存在的方法。看来用户对数据库操作比较熟悉,可能是个开发者或者运维人员。之前用户提到过“判断是否存在”,这次转向了更细粒度的数据存在判断,说明需求在深化。 用户引用的信息其实只涉及表级判断,但实际问的是行级数据存在性,需要区分清楚。这个问题在数据库操作中很常见,特别是避免重复插入或验证业务数据时。 核心解决方案是用SELECT EXISTS子查询,这个最符合用户需求。不过考虑到用户可能是不同场景,我准备了三种方法:EXISTS效率最高适合判断存在性,COUNT(*)适合需要统计数量的场景,LIMIT 1是折中方案。用户没提性能要求,但作为专业建议应该包含这点。 示例特意用了用户可能接触的电商场景,订单号检查很典型。注意提醒NULL值处理的细节,因为很多人会忽略count(*)对NULL的统计特性。用户之前的问题表明ta可能用Python操作MySQL,所以补充了pymysql的代码示例——这比纯SQL更有实操价值。 用户上次对相关问题的延伸感兴趣,这次也保持这个模式。三个延伸问题覆盖了索引优化(性能关键)、防重复插入(常见业务场景)、替代方案(拓展视野),应该能命中用户潜在需求。特别是防重复插入,很多开发者会在这踩坑。 最后检查所有SQL语法,确保$包裹的变量格式正确,代码块标注语言类型。引用标记[^1]要对应到正确的帮助文档。 </think>在MySQL判断某条数据是否存在,主要通过 `SELECT` 语句结合条件查询实现。以下是三种常用方法及示例: --- ### 方法一:使用 `EXISTS` 子查询(推荐) ```sql SELECT EXISTS( SELECT 1 FROM your_table WHERE column_name = 'target_value' ) AS result; ``` - **结果**:返回 `1`(存在)或 `0`(不存在) - **优点**:效率高,找到匹配项立即终止扫描 - 示例:检查用户表中是否存在 `user_id=100` 的用户 ```sql SELECT EXISTS( SELECT 1 FROM users WHERE user_id = 100 ) AS user_exists; ``` --- ### 方法二:使用 `COUNT(*)` ```sql SELECT COUNT(*) > 0 AS result FROM your_table WHERE column_name = 'target_value'; ``` - **结果**:返回布尔值(`1`/`0`) - **注意**:需全表扫描,大数据表性能较差 --- ### 方法三:`LIMIT 1` 优化 ```sql SELECT 1 FROM your_table WHERE column_name = 'target_value' LIMIT 1; ``` - **判断逻辑**: 若查询返回行 → 存在;无结果 → 不存在 - 代码中处理示例(Python): ```python cursor.execute(""" SELECT 1 FROM orders WHERE order_id = 'ABC123' LIMIT 1 """) exists = bool(cursor.fetchone()) # True/False ``` --- ### 关键注意事项 1. **索引优化**: WHERE 条件列(如 `user_id`)必须建索引,否则大表查询效率极低 ```sql CREATE INDEX idx_userid ON users(user_id); ``` 2. **NULL 值处理**: 若字段可能为 `NULL`,需用 `IS NULL` 判断: ```sql SELECT EXISTS( SELECT 1 FROM products WHERE price IS NULL ); ``` 3. **防重复插入场景**(组合键检查): ```sql INSERT INTO orders (order_id, product_id) SELECT 'O100', 'P200' FROM DUAL WHERE NOT EXISTS( SELECT 1 FROM orders WHERE order_id='O100' AND product_id='P200' ); ``` --- ### 性能对比 | 方法 | 扫描方式 | 大数据表性能 | |---------------|---------------|-------------| | `EXISTS` | 短路扫描 | ⭐⭐⭐⭐⭐ | | `LIMIT 1` | 找到即停 | ⭐⭐⭐⭐ | | `COUNT(*)` | 全表扫描 | ⭐ | > 📌 **实践建议**:高频查询字段务必建立索引,`EXISTS` 是首选方案[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值