У меня есть 2 таблицы:
table_com
-------------
id_com|code|value|
----------------
1 |10 | A
2 |20 | B
table_b
----------
id_b|code
----------
1 |10
2 |20
3 |30
Я хочу вставить в table_com
каждый реестр, который существует в table_b
, но не в table_com
(по code
), в примере будет id_b==3
, потому что этот код = 30 он отсутствует в table_a
, а для значения, Мне нужно поставить 0. Окончательный table_com
должен выглядеть следующим образом:
table_com
-------------
id_com|code|value|
-----------------
1 |10 | A
2 |20 | B
3 |30 | 0
Я работаю с php, я попробовал значение foreach table_b и попытался вставить значения, как я уже сказал, но не уверен, как это сделать (я знаю, что с INSERT INTO я не могу использовать WHERE, это просто пример):
foreach ($comunas as $key => $value) {
$code = $value->code;
DB::select(DB::raw("
INSERT INTO rgl_clientes_comuna (
code,
value
)
VALUES
($code, 0,)
WHERE code IS NOT $code
"));
}
РЕДАКТИРОВАТЬ:
1) Для первого ответа я попробовал это (с моими настоящими данными):
INSERT INTO rgl_clientes_comuna (
comuna_id,
numero_clientes
) SELECT
cod_comuna,
0
FROM
rgl_cut ON DUPLICATE KEY UPDATE comuna_id = 12201
Он работает, но он добавляет новую строку для каждого реестра на table_b
Как насчет этого?
insert into table_com
select id_b, code, 0
from table_b where id_b not in (select id_com from table_com);
или это?
insert into table_com
select id_b, code, 0
from table_b where code not in (select code from table_com);
поскольку я не понимаю, является ли решающим фактором наличие id
или code
Я бы просто использовал insert on duplicate key update
:
insert into a (code, value)
select code, 0
from b
on duplicate key update code = values(code);
Чтобы это сработало, вам нужен уникальный индекс/ограничение a(code)
.
UPDATE
not in (select
черт возьми, спасибо! (Я использую первый код)