Eu tenho duas tabelas (em dois bancos de dados):
create table catalog_product_entity_text
(
value_id int auto_increment comment 'Value ID'
primary key,
attribute_id smallint unsigned default 0 not null comment 'Attribute ID',
store_id smallint unsigned default 0 not null comment 'Store ID',
entity_id int unsigned default 0 not null comment 'Entity ID',
value longtext null comment 'Value',
constraint CATALOG_PRODUCT_ENTITY_TEXT_ENTITY_ID_ATTRIBUTE_ID_STORE_ID
unique (entity_id, attribute_id, store_id),
constraint CATALOG_PRODUCT_ENTITY_TEXT_STORE_ID_STORE_STORE_ID
foreign key (store_id) references store (store_id)
on delete cascade,
constraint CAT_PRD_ENTT_TEXT_ATTR_ID_EAV_ATTR_ATTR_ID
foreign key (attribute_id) references eav_attribute (attribute_id)
on delete cascade,
constraint CAT_PRD_ENTT_TEXT_ENTT_ID_CAT_PRD_ENTT_ENTT_ID
foreign key (entity_id) references catalog_product_entity (entity_id)
on delete cascade
)
create table catalog_product_entity_varchar
(
value_id int auto_increment comment 'Value ID'
primary key,
attribute_id smallint unsigned default 0 not null comment 'Attribute ID',
store_id smallint unsigned default 0 not null comment 'Store ID',
entity_id int unsigned default 0 not null comment 'Entity ID',
value varchar(255) null comment 'Value',
constraint CATALOG_PRODUCT_ENTITY_VARCHAR_ENTITY_ID_ATTRIBUTE_ID_STORE_ID
unique (entity_id, attribute_id, store_id),
constraint CATALOG_PRODUCT_ENTITY_VARCHAR_STORE_ID_STORE_STORE_ID
foreign key (store_id) references store (store_id)
on delete cascade,
constraint CAT_PRD_ENTT_VCHR_ATTR_ID_EAV_ATTR_ATTR_ID
foreign key (attribute_id) references eav_attribute (attribute_id)
on delete cascade,
constraint CAT_PRD_ENTT_VCHR_ENTT_ID_CAT_PRD_ENTT_ENTT_ID
foreign key (entity_id) references catalog_product_entity (entity_id)
on delete cascade
)
Minha _text
tabela contém alguns dados que gostaria de transferir para a _varchar
tabela, mas não há correlação com as chaves primárias. A chave primária é apenas incremento automático.
Logicamente as tabelas são conectadas pelo conjunto (attribute_id, store_id, entity_id)
.
Eu gostaria de realizar duas ações:
Selecione todos os valores da
_text
tabela para ids de atributos específicos, por exemploselect cpet.attribute_id, cpet.store_id, cpet.entity_id, cpet.value from catalog_product_entity_text cpet where cpet.attribute_id in (<myids>) and cpet.value is not null;
Agora, para cada linha nos resultados acima, gostaria de:
Se houver correspondência
(attribute_id, store_id, entity_id)
na_varchar
tabela, atualize essa linha.Se não houver correspondência
(attribute_id, store_id, entity_id)
na_varchar
tabela, adicione uma nova linha com os dados da linha de origem.
Se eu tivesse uma chave primária comum, usaria REPLACE INTO
, mas nesse caso não acho adequado.
Como posso construir tal consulta? Não precisa ser uma única consulta.
Veja como atualizar os registros que existem
catalog_product_entity_varchar
e estão relacionados a um registro emcatalog_product_entity_text
:Depois de fazer a atualização, você pode inserir o que está faltando assim: