繁体   English   中英

Mysql,如果表A中存在外键,则将新记录插入表B

[英]Mysql, Insert new record into table B if foreign key exists in table A

这里有几个类似的问题。 没有一个提供解决方案。 我想在表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'

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

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

试试这个:

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'
)

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

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

如果我们想让一个User加入一个Thread我们需要在Thread_Users中插入一行, 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 更好的方法,尤其是当不存在的外键概率非常低时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM