簡體   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