Problema
Tendo um banco de dados existente, precisamos adicionar a a column
a table
, sendo esta coluna do tipo int
, existe uma maneira de definir o valor inicial padrão como resultado de uma consulta no banco de dados?
Apenas para dar um pouco mais de contexto do problema. Este valor 'padrão' seria usado apenas inicialmente, quando a coluna for adicionada, então podemos alterar a nova coluna novamente dando um padrão normal (exemplo default 0
)
Fazendo isso, você seria capaz de inicializar um valor em um banco de dados existente, sem a necessidade de uma migração (provavelmente através de um script fazendo um loop no existente, objects
contando quantos itens eles têm e dando seu valor inicial.
Exemplo:
esquema
create table object
(
object_id int auto_increment primary key,
name varchar(120) not null
);
create table item
(
item_id varchar(63) not null,
object_id int not null,
primary key (object_id, item_id)
);
insert into object (name) VALUES ("hello");
insert into item (item_id, object_id) VALUES
("item1", 1),
("item2", 1),
("item3", 1),
("item4", 1);
Podemos a quantidade total de item para cada objeto desta forma
-- Counting item of object
SELECT COUNT(*) AS total, o.object_id , o.name
FROM item AS i
JOIN object o on i.object_id = o.object_id
GROUP BY o.object_id ORDER BY total DESC LIMIT 50;
total |
---|
4 |
estou procurando algo assim
ALTER TABLE object ADD COLUMN item_count INT DEFAULT (
SELECT COUNT(*) AS total
FROM item AS i
JOIN object o on i.object_id = o.object_id
GROUP BY o.object_id ORDER BY total DESC LIMIT 50
);
Se esse recurso não existe, diga-me, não seria uma boa ideia tê-lo :)?
Não, você não pode usar uma subconsulta em uma cláusula DEFAULT.
No MySQL 8.0.13, eles adicionaram um recurso para permitir que uma cláusula DEFAULT seja uma expressão, mas ainda não pode ser uma subconsulta:
https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html#data-type-defaults-explicit
A maneira que eu faria o que você descreve:
Primeiro, adicione a coluna normalmente. Será NULL nas linhas existentes.
Em seguida, ATUALIZE a tabela para definir os NULLs para os valores de contagem que você deseja:
Agora você tem outra tarefa para mantê-los sincronizados daqui para frente, mas você só perguntou sobre como definir o valor inicial deles no momento de adicionar a coluna.
Você também perguntou:
Claro. Seria bom ter um recurso que tornasse qualquer tarefa que estamos fazendo hoje fácil de fazer em uma única instrução. Mas se cada tarefa que alguém precisa fazer em qualquer dia recebesse seu próprio comando de propósito especial, a linguagem de programação precisaria de um número infinito de comandos especiais que seriam usados apenas uma vez.