2017-06-30 25 views
1

デフォルト値はどのように内部的にデータベースで機能しますか?デフォルト値はどのように内部的にデータベースで機能しますか?

私はテーブルを変更した場合:

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

が、それはすべての行を更新しますか?または、値が存在しない場合、デフォルト値は単なる値参照ですか?

+0

@juergend Bill Karwinの答えを見てください。 – Barmar

+0

「価値がない場合」とはどういう意味ですか?新しい列を追加していますので、どのような値がどのように表示されるのですか? 「既存の列にデフォルト値を追加するとどうしたらいいでしょうか」と尋ねられたら、質問はもっと意味があります。 – mathguy

+0

@Barmar:ああ - 私はそれが新しい列であるとは思わなかった。私はそれが既存のものだと思った。 –

答えて

3

これをテストするのは簡単です。 1つ以上の行を持つ表に列を追加すると、新しい列がデフォルトに設定されます。

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 | 
+-----+------------+ 

これは、行が挿入されたときにデフォルト値が行にコピーされることを意味します。一度にデフォルトしかないので、行にデフォルトへのポインタが含まれていて、デフォルトを変更した場合、デフォルトを使用していた古い行は、新しいデフォルト値を指しているように遡及して変化するように見えます。

私は上記のとおり、彼らはそれをしません。古い行には、行が作成された時点で有効だったデフォルト値がまだ含まれています。デフォルト値が行にコピーされました。

+0

質問を正しく解釈すると、これは役に立たないかもしれません。彼は、すべての行にデフォルトをコピーするか、メタデータからデフォルトをフェッチするというフラグを使用して、実装されているかどうかを尋ねているかもしれません。 – Barmar

+0

どちらの実装でも同じ出力が生成されます。 – Barmar

+2

実際に何をしているのかを知る方法は、デフォルト値を変更して、デフォルトを使用していた既存の行が変更されないことに注意してください。 – Barmar

0

以前にテーブルを変更するデータは変更されません。 Es:変更後にnullが返される場合は、nullでもある