簡體   English   中英

mysql使用內部join和max()將兩個表插入一個表中

[英]mysql insert from two tables into one using inner join and max()

我檢查了建議的帖子,但找不到答案。 我正在制作具有多對多關系和三個MySQL表的CRUD應用程序。 一個表稱為“ pm”:

CREATE TABLE `pm` (
`pm_id` int(11) NOT NULL AUTO_INCREMENT,
`pm_name` varchar(45) NOT NULL,
`pm_address` varchar(45) DEFAULT NULL,
`valid_through` int(11) NOT NULL,
 PRIMARY KEY (`pm_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

 +-------+---------+------------------------+---------------+ | pm_id | pm_name | pm_address | valid_through | +-------+---------+------------------------+---------------+ | 1 | Alpha | http://www.alpha.com | 190303 | | 2 | Bravo | http://www.bravo.com | 200506 | | 3 | Charlie | http://www.charlie.com | 190708 | | 4 | Delta | http://www.delta.com | 210509 | | 5 | Echo | http://www.echo.com | 230416 | | 6 | Foxtrot | http://www.foxtrot.com | 181011 | +-------+---------+------------------------+---------------+ 

另一個稱為“搜索詞”:

CREATE TABLE `searchwords` (
`searchword_id` int(11) NOT NULL AUTO_INCREMENT,
`searchword` varchar(45) NOT NULL,
PRIMARY KEY (`searchword_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

 +---------------+------------+ | searchword_id | searchword | +---------------+------------+ | 1 | apples | | 2 | oranges | | 3 | pears | | 4 | bananas | | 5 | grapes | +---------------+------------+ 

第三個是join_table:

CREATE TABLE `join_table` (
`id_join_table` int(11) NOT NULL AUTO_INCREMENT,
`pm_id` int(11) DEFAULT NULL,
`searchword_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id_join_table`),
KEY `FK1_idx` (`pm_id`),
KEY `FK2_idx` (`searchword_id`),
CONSTRAINT `FK1` FOREIGN KEY (`pm_id`) REFERENCES `pm` (`pm_id`) ON DELETE 
NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK2` FOREIGN KEY (`searchword_id`) REFERENCES `searchwords` 
(`searchword_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

 +---------------+-------+---------------+ | id_join_table | pm_id | searchword_id | +---------------+-------+---------------+ | 8 | 6 | NULL | | 9 | 6 | NULL | | 10 | 6 | NULL | +---------------+-------+---------------+ 

下面是我現在擁有的SQL。 例如,在結尾處有“橙色”,我想-進入“ join_table”的新行中-將最大pm_id從“ pm”放入pm_id列,並將對應於橘子的searchword_id從“ searchwords”放入searchword_id列。

INSERT INTO join_table (pm_id, searchword_id)
SELECT (SELECT MAX(pm_id) FROM pm), (SELECT DISTINCT
searchwords.searchword_id FROM searchwords
INNER JOIN join_table ON 
searchwords.searchword_id = join_table.searchword_id
WHERE searchword = "oranges");

該SQL有時魔術般地起作用,但通常沒有(這種不一致怎么可能?)。 pm_id值始終位於該位置,因此我傾向於使用正確的值作為pm_id並將searchword設置為NULL的行,如上所示。 幫助將不勝感激!

實際上,我只是使用以下方法解決了問題:

INSERT INTO join_table (pm_id, searchword_id)
SELECT MAX(pm_id), searchword_id
FROM pm, searchwords
WHERE searchword="bananas"

內連接仍然如此,2017年對不對?

但是現在我在嘗試刪除帖子並遇到錯誤時遇到問題:

Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint 
violation: 1451 Cannot delete or update a parent row: a foreign key 
constraint fails (`database`.`join_table`, CONSTRAINT `FK1` 
FOREIGN KEY (`pm_id`) REFERENCES `pm` (`pm_id`)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM