问题
有一个现有的数据库,我们需要将 a 添加column
到 a table
,此列的类型为int
,有没有办法将默认初始值设置为数据库中查询的结果?
只是为了提供更多问题的背景信息。此“默认”值仅在最初使用,当添加列时,我们可能会再次更改新列以提供正常的默认值(示例default 0
)
通过这样做,您将能够将一个值初始化到现有数据库中,而无需迁移(可能通过循环现有的脚本objects
,计算它们有多少项目并给出其初始值。
例子:
图式
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);
我们可以通过这种方式计算每个对象的项目总量
-- 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;
全部的 |
---|
4个 |
我看起来像这样
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
);
如果此功能不存在,请告诉我,拥有它不是一个好主意 :)?
不,您不能在 DEFAULT 子句中使用子查询。
在 MySQL 8.0.13 中,他们添加了一个特性,允许 DEFAULT 子句是一个表达式,但它仍然不能是一个子查询:
https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html#data-type-defaults-explicit
我会做你描述的方式:
首先,正常添加列。它将在现有行上为 NULL。
然后更新表以将 NULL 设置为所需的计数值:
现在您有另一项任务让它们在以后保持同步,但您只询问了在添加列时设置它们的初始值。
你还问:
当然。如果有一个功能可以使我们今天所做的任何任务都可以在一条语句中轻松完成,那就太好了。但是,如果任何人在任何一天需要完成的每项任务都被赋予了自己的特殊用途命令,那么编程语言将需要无限数量的只能使用一次的特殊命令。