当前位置: 首页 > 面试题库 >

MySQL INSERT INTO具有双重条件,如果不存在

钱锐
2023-03-14
问题内容

如果电子邮件地址在list_email.email_addr中不存在且在list_no_email.email_addr中不存在,我正在尝试插入新记录

INSERT INTO list_email(fname, lname, email_addr) VALUES('bob', 'schmoe', 'bogus@bogus.com'), ('mary', 'lamb', 'hoe@me.com');
SELECT email_addr FROM list_email
WHERE NOT EXIST(
SELECT email_addr FROM email_addr WHERE email_addr = $post_addr
) 
WHERE NOT IN (
SELECT email_addr FROM list_no_email WHERE email_addr = $post_addr
)LIMIT 1


**************************** mysql tables ******************************

mysql> desc list_email;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| list_name  | varchar(55)  | YES  |     | NULL    |                |
| fname      | char(50)     | YES  |     | NULL    |                |
| lname      | char(50)     | YES  |     | NULL    |                |
| email_addr | varchar(150) | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

5 rows in set (0.00 sec)

mysql> desc list_no_email;
+------------+--------------+------+-----+-------------------+-----------------------------+
| Field      | Type         | Null | Key | Default           | Extra                       |
+------------+--------------+------+-----+-------------------+-----------------------------+
| id         | int(11)      | NO   | PRI | NULL              | auto_increment              |
| date_in    | timestamp    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| email_addr | varchar(150) | YES  |     | NULL              |                             |
+------------+--------------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)

*_ __ _ __ __ * 错误 * __ __ *
*

INSERT INTO list_email(fname, lname, email_addr) VALUES('bob', 'schmoe', 'bogus@bogus.com'), ('mary', 'lamb', 'hoe@me.com'); SELECT email_addr FROM list_email WHERE NOT EXIST( SELECT email_addr FROM email_addr WHERE email_addr = $post_addr )  WHERE NOT IN ( SELECT email_addr FROM list_no_email WHERE email_addr = $post_addr )LIMIT 1;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT email_addr FROM email_addr WHERE email_addr = $post_addr )  WHERE NOT IN ' at line 1

*_ __ _ __ __ 不带; __ * __ __ * __ **

mysql> INSERT INTO list_email(fname, lname, email_addr) VALUES('bob', 'schmoe', 'bogus@bogus.com'), ('mary', 'lamb', 'hoe@me.com')
    -> SELECT email_addr FROM list_email AS tmp
    -> WHERE NOT EXIST(
    -> SELECT email_addr FROM email_addr WHERE email_addr = $post_addr
    -> )
    -> WHERE NOT IN (
    -> SELECT email_addr FROM list_no_email WHERE email_addr = $post_addr
    -> )LIMIT 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT email_addr FROM list_email AS tmp
WHERE NOT EXIST(
SELECT email_addr FROM' at line 2

问题答案:

代替

WHERE NOT EXIST(

WHERE email_addr NOT IN(

编辑

代替

SELECT email_addr FROM list_email
WHERE NOT IN
(
    SELECT email_addr FROM email_addr WHERE email_addr = $post_addr
) 
WHERE NOT IN
(
    SELECT email_addr FROM list_no_email WHERE email_addr = $post_addr
)LIMIT 1

SELECT email_addr FROM list_email
WHERE NOT IN
(
    SELECT email_addr FROM email_addr WHERE email_addr = $post_addr
    UNION ALL
    SELECT email_addr FROM list_no_email WHERE email_addr = $post_addr
)
LIMIT 1


 类似资料:
  • 我正在尝试制作一个程序,如果文件存在,它将读取该文件。如果文件不存在,那么我希望它返回并再次请求用户输入。现在我已经知道了,它会停下来,但我想让它回过头来,再问一次,有什么想法吗?

  • 问题内容: 是否有只查询记录的查询,如果不存在,则插入?我不想重复更新或替换。寻找一个查询解决方案,寻找其他答案,但不是我真正想要的。 表: 伪查询: 问题答案: 使用-与INSERT完全相同,不同之处在于,如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前会删除该旧行。 http://dev.mysql.com/doc/refman/5.0/en/rep

  • 我试图使用和实现以下缓存逻辑: 如果过期时间已经过去,条件(需要计算和I/O)被评估为TRUE,然后强制获取数据并更新缓存。 如果过期时间已经过去,条件(需要计算和I/O)被计算为FALSE,那么不要使缓存数据无效,并从缓存中检索值。 如果过期时间未过,则从缓存中检索该值。 我按照这个指南工作:https://www.baeldung.com/spring-boot-caffeine-cache

  • 问题内容: 我有一个按名称列出的客户表:在SQL中,其中有3列:, 此表中有重复的条目,但 时间戳记 不同。 例如 我想从数据库中消除此问题,并保持第一时间/日期可用。 谢谢。 问题答案: 这有效,请尝试: 在子查询中,它确定哪个记录是每个的第一个记录,然后删除所有其他记录以作重复。我还添加了该子句,该子句返回受该语句影响的行。 您也可以通过使用排名功能来做到这一点: 看看哪一个查询开销较小并使用

  • 问题内容: 这实际上可能是一个愚蠢的问题,但我想知道是否有可能使用if语句执行所有条件。我解释: 当所有三个方法都返回true时执行。关键是,当一个方法返回false时,其余方法将不会执行。这通常对性能而言是一件好事,但是如果我真的需要独立于所有方法返回的值来执行所有方法,然后对表达式求值并进入if与否,该怎么办?同样适用于OR或其他 有没有一种方法可以告诉Java采取这种方式?我目前的解决方法是

  • 问题内容: 我一直在发疯,试图使评论条件生效,但我没有运气能有人解释我做错了什么吗? 这是我的代码: 发生的事情令人沮丧地不一致。当我在 IE8中 使用上述代码加载页面时,会收到消息 “ IE 低于 版本9”, 对吗?否,因为当我在 IE10中 加载SAME PAGE时,收到消息 “浏览器不是IE” 为什么会认为IE10不是IE浏览器?我一直在逐页进行爬网,但是从我发现的代码来看,似乎没有什么错。