Mysql,如果 table A 中存在外键,则将新记录插入 table B
Mysql, Insert new record into table B if foreign key exists in table A
这里有几个类似的问题。 None提供解决方案。我想将 NEW 记录插入 table B,但前提是 table 中存在外键 A。明确地说,我不想插入 select 的结果。我只需要知道外键存在。
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'
)
我知道这是一个相当古老的回答问题,但它现在在 google 搜索结果中排名很高,我认为添加一些内容可能会对将来的人有所帮助。
在某些数据库配置中,您可能希望在具有两个或更多外键的 table 中插入一行。假设我们在聊天应用程序中有四个 table:
Users
、Threads
、Thread_Users
和 Messages
如果我们想要一个 User
加入一个 Thread
我们需要在 Thread_Users
中插入一行,其中有两个外键:user_id
, thread_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)
它有点冗长,但它做得很好。
Application-side,如果 affectedRows = 0,我们只需要引发一个错误,并且可能会尝试查看哪些键不存在。恕我直言,这是一种比执行两个 SELECT 查询然后执行 INSERT 更好的方法,尤其是在外键不存在的概率非常低的情况下。
这里有几个类似的问题。 None提供解决方案。我想将 NEW 记录插入 table B,但前提是 table 中存在外键 A。明确地说,我不想插入 select 的结果。我只需要知道外键存在。
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'
)
我知道这是一个相当古老的回答问题,但它现在在 google 搜索结果中排名很高,我认为添加一些内容可能会对将来的人有所帮助。
在某些数据库配置中,您可能希望在具有两个或更多外键的 table 中插入一行。假设我们在聊天应用程序中有四个 table:
Users
、Threads
、Thread_Users
和 Messages
如果我们想要一个 User
加入一个 Thread
我们需要在 Thread_Users
中插入一行,其中有两个外键:user_id
, thread_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)
它有点冗长,但它做得很好。
Application-side,如果 affectedRows = 0,我们只需要引发一个错误,并且可能会尝试查看哪些键不存在。恕我直言,这是一种比执行两个 SELECT 查询然后执行 INSERT 更好的方法,尤其是在外键不存在的概率非常低的情况下。