Estou em uma situação em que tenho uma tabela base com alguns campos e um campo discriminador que poderia ter um de um conjunto específico de valores.
A partir dessa tabela base, deriguei muitas exibições, uma para cada valor de discriminador possível, mas essas exibições não incluem a própria coluna do discriminador.
O problema é que, quando tento INSERT INTO em uma das visualizações, a inserção é bem-sucedida, mas o campo discriminador na tabela base é NULL.
Não existe uma maneira de inserir na exibição com o valor do discriminador definido corretamente? Ou preciso necessariamente inserir na tabela base ao invés disso?
Aqui está um exemplo do que quero dizer:
create table base_table (
a int unsigned auto_increment primary key,
b char(10) default null,
c char(10) default null,
x tinyint unsigned default null
);
create or replace view base_view_1 as
select a, b, c
from base_table
where x = 1;
create or replace view base_view_2 as
select a, b, c
from base_table
where x = 2;
[ ... and so on ... ]
insert into base_view_1 (a, b, c) VALUES (null, 'xxx', 'xxx');
select * from base_view_1; -- no result
select * from base_table; -- one row like (1, 'xxx', 'xxx', null)
Veja que, no exemplo, a linha da base_table tem null
o valor de x
? O mysql deve ser capaz de preencher esse campo automaticamente com base na definição de exibição?
O que eu gostaria de conseguir é que, ao inserir na view base_view_1
, já que ela está definida para x = 1
, o mysql defina automaticamente o valor correto em base_table
, e o mesmo ao inserir em base_view_2
where x
should be 2
, e assim sucessivamente, por exemplo:
insert into base_view_1 (b, c) values ('xxx', 'xxx'); // should insert into base_table the values ('xxx', 'xxx', 1)
insert into base_view_2 (b, c) values ('xxx', 'xxx'); // should insert into base_table the values ('xxx', 'xxx', 2)
// and so on for each distinct discriminator value
Agora, o mysql é capaz de fazer isso automaticamente para mim ou preciso recorrer à inserção diretamente na base_table?
Você deve fazer seus INSERTs apenas na tabela base
Dessa forma, você pode inserir consultas como estas
Se você fizer consultas INSERT como estas
então você deve atribuir um valor padrão de 1 para
x
na definição da tabelaCaso contrário, você deve apenas INSERT into
base_table
, pois não existe nenhum mecanismo para alternar dinamicamente o valor padrãox
dentro da definição de uma exibição. Ax
coluna não pode ser selecionada na visualização (porque você a deixou de fora da cláusula SELECT). Consequentemente, definitivamente não teria capacidade de ser atualizado ou atribuído na exibição.De uma chance !!!