默认值如何在数据库内部工作?
如果我改变一张桌子:
alter table foo
add column aws_region varchar(32) default 'us-east-1';
它会更新所有行吗?或者,如果值不存在,默认值只是一个值查找?
答案 0 :(得分:3)
很容易测试出来。如果向具有一行或多行的表添加列,则会将新列设置为默认值。
mysql> create table foo (id int primary key);
mysql> insert into foo values (123);
mysql> alter table foo
-> add column aws_region varchar(32) default 'us-east-1';
mysql> select * from foo;
+-----+------------+
| id | aws_region |
+-----+------------+
| 123 | us-east-1 |
+-----+------------+
如果更改列的定义,则不会更改现有行。创建行时设置每行中的值,而不是在查询时设置。
mysql> alter table foo
-> modify column aws_region varchar(32) default 'us-west-2';
mysql> select * from foo;
+-----+------------+
| id | aws_region |
+-----+------------+
| 123 | us-east-1 |
+-----+------------+
更改默认值后插入的新行使用新的默认值。旧行仍然具有旧值。
mysql> insert into foo (id) values (456);
mysql> select * from foo;
+-----+------------+
| id | aws_region |
+-----+------------+
| 123 | us-east-1 |
| 456 | us-west-2 |
+-----+------------+
这意味着在插入行时将默认值复制到行中。一次只有默认值,因此如果行包含指向默认值的指针,然后我们更改了默认值,则使用默认值的旧行似乎会追溯更改,因为它们现在指向新的默认值。
正如我在上面所示,他们不这样做。旧行仍包含在创建行时生效的默认值。默认值已复制到行中。
答案 1 :(得分:0)
之前改变表格的数据不会改变。 Es:如果在alter之后为null,则它也为null