У меня есть проект PHP / MySQL, над которым я сейчас работаю, и я застрял в сложной (или, по крайней мере, для меня) функции вставки.
3 таблицы, которые применяются здесь
клиент
Здесь уместны следующие поля: clientpk (первичный ключ AI) и клиентская область.
Templatedocs
, Соответствующие поля: templatepk, doctype, doctitle, templatescope
ClientDocs
Поля, которые имеют отношение к docpk, doctype, doctitle
То, что я хочу сделать, это иметь код после того, как я добавлю новую запись в таблицу клиента, которая вставляет записи из таблицы templatedocuments в таблицу clientdocuments, где client.clientscope = templatedocuments.templatescope, и я подозреваю, что это будет функция foreach.
Я только когда-либо работал с запросами вставки, которые вставляют из одной таблицы в другую, а не там, где используются 3 таблицы.
Если кто-то может дать мне основную идею, тогда я смогу понять все остальное, спасибо.
ОБНОВЛЕНИЕ: я пытаюсь сказать, что ClientTable — это Таблица A, TemplateDocuments — это Таблица B, а ClientDocuments — это TableC. Я знаю, как вставить записи из таблицы A в таблицу C, когда пишу функцию вставки из таблицы A. Однако я не знаю, как вставить данные из таблицы B (которая по сути является несвязанной таблицей ресурсов) в таблицу C, используя текущие переменные из таблицы B.
Чтобы поместить это в контекст, в Таблице B теперь есть 147 различных записей, только 50 из них окажутся в каждой таблице C, потому что есть различия, это область client.clientscope и templatedocuments.template, которая фильтрует соответствующие записи для вставить.
Ты можешь использовать join
в insert.. select
синтаксис:
INSERT INTO clientdocuments (doctype, doctitle)
SELECT doctype, doctitle
FROM templatedocuments t
JOIN client c ON t.templatescope = c.clientscope
WHERE client.clientpk = 123
Вы можете использовать триггер что-то связать это на стороне MySQL:
DELIMITER $$
USE `databaseName`$$
DROP TRIGGER /*!50032 IF EXISTS */ `trigger_TableName`$$
CREATE
TRIGGER `trigger_Templatedocs` AFTER UPDATE ON `Client`
FOR EACH ROW BEGIN
IF NEW.field <> OLD.field THEN
INSERT INTO Templatedocs (fieldName, fieldName2) VALUES (NEW.field, NEW.field);
END IF;
END;
$$
DELIMITER ;
Я не уверен, что это работает для вас или нет, но вы можете попробовать это.
Вы можете сделать это с помощью AFTER INSERT
активировать client
Таблица; что-то вроде ниже
DELIMITER $$
create trigger trg_insert_clientdocs
after insert on Client
for each row
begin
INSERT INTO ClientDocs(doctype, doctitle)
select td.doctype, td.doctitle
from Templatedocs td
where td.templatescope = new.clientscope;
END$$
DELIMITER ;
Над кодом триггера будет вставлена запись в ClientDocs
стол из Templatedocs
таблица основана на совпадении templatescope
колонка; где значение templatescope
столбец такой же, как недавно вставленное значение в Client
Таблица clientscope
колонка.