mysql вставка из двух таблиц в одну с использованием внутреннего соединения и max () - PullRequest
0 голосов
/ 01 июня 2018

Я проверил предложенные сообщения, но не смог найти ответ.Я делаю приложение CRUD с отношением многие ко многим и тремя таблицами MySQL.Одна таблица называется "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 |
+-------+---------+------------------------+---------------+

Другой называется "searchwords":

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, как показано выше.Помощь будет высоко ценится! *

1 Ответ

0 голосов
/ 02 июня 2018

На самом деле я только что решил, используя:

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

Вздох

...