【问题标题】:Mysql, Insert new record into table B if foreign key exists in table AMysql,如果表A中存在外键,则将新记录插入表B
【发布时间】:2016-09-21 12:41:31
【问题描述】:

这里有几个类似的问题。没有人提供解决方案。我想将 NEW 记录插入到表 B 中,但前提是表 A 中存在外键。需要明确的是,我不想插入选择的结果。我只需要知道外键存在。

INSERT INTO tableB (tableA_ID,code,notes,created) VALUES ('24','1','test',NOW())
        SELECT tableA_ID FROM tableA WHERE tableA_ID='24' AND owner_ID='9'

显然,上述方法不起作用。但这甚至可能吗?我想将 NEW 数据插入到 tableB 中,前提是 tableA 中的行的记录存在并且属于 owner_ID。

到目前为止,我看到的查询与插入 SELECT 查询的结果有关——我不希望这样做。

【问题讨论】:

    标签: mysql select insert key


    【解决方案1】:

    试试这个:

    INSERT INTO tableB (tableA_ID,code,notes,created) 
    SELECT id, code, notes, created
    FROM ( SELECT '24' as id, '1' as code, 'test' as notes, NOW() as created) t
    WHERE EXISTS 
    (
       SELECT tableA_ID 
       FROM tableA 
       WHERE tableA_ID='24' AND owner_ID='9'
    )
    

    【讨论】:

    • 感谢您的回复,但这会导致错误 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 'VALUES ('24','1','test',NOW()) ) t(.... 附近使用的正确语法
    • @BernieDavies 当我最初发布我的答案时,我认为它是针对 SQL Server 的!请检查我所做的修改。
    • 是的! Giorgos,这似乎工作得很好。谢谢你。非常感谢。
    【解决方案2】:

    我知道这是一个非常古老的问题,但它现在在谷歌搜索结果中排名很高,我认为一些补充可能会在未来帮助某人。

    在某些数据库配置中,您可能希望在具有两个或多个外键的表中插入一行。假设我们在聊天应用程序中有四个表: UsersThreadsThread_UsersMessages

    如果我们想让User 加入Thread,我们需要在Thread_Users 中插入一行,其中有两个外键:user_idthread_id

    然后,我们可以使用这样的查询,如果两个外键都存在则插入,否则静默失败:

    INSERT INTO `thread_users` (thread_id,user_id,status,creation_date)
    SELECT 2,3,'pending',1601465161690 FROM (SELECT 1 as nb_threads, 1 as nb_users) as tmp 
    WHERE tmp.nb_threads = (SELECT count(*) FROM `threads` WHERE threads.id = 2)
          AND tmp.nb_users = (SELECT count(*) FROM `users` WHERE users.id = 3)
    

    这有点冗长,但做得很好。

    在应用程序方面,如果受影响的行 = 0,我们只需要引发一个错误,并且可能会尝试查看哪些键不存在。恕我直言,这是一种比执行两个 SELECT 查询然后执行 INSERT 更好的方法,尤其是在外键不存在的概率非常低的情况下。

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 1970-01-01
      • 2021-11-14
      • 2011-03-11
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多