默认值如何在数据库内部工作?

时间:2017-06-30 20:41:36

标签: mysql database

默认值如何在数据库内部工作?

如果我改变一张桌子:

alter table foo
add column aws_region varchar(32) default 'us-east-1';

它会更新所有行吗?或者,如果值不存在,默认值只是一个值查找?

2 个答案:

答案 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