В чем разница между значением по умолчанию и значением null в процессе миграции

В чем разница между:

t.boolean :test, :default => true

а также

t.boolean :test, :null => true

а также

t.boolean :test, :default => true, :null => true

РЕДАКТИРОВАТЬ

Имеет ли смысл следующее?

t.boolean :test, :default => true, :null => false

Ответ 1

"null" означает "разрешено ли вам вводить нулевое значение в этом столбце"?

В то время как "default" означает "если в этом столбце есть нулевое значение... тогда используйте это значение по умолчанию",

Итак, для ваших примеров:

t.boolean :test, :default => true

"этот логический столбец вставляет значение true, если вы не утруждаете настройкой значения для него"

t.boolean :test, :null => true

"этот логический столбец позволит вам установить его в true, false или null - и он останется таким, каким вы его установили"

t.boolean :test, :default => true, :null => true

"этот логический столбец позволит вам установить его в true, false или null... но если вы установите его значение null, оно будет автоматически установлено на true"

Ответ 2

: default - Значение по умолчанию для столбцов. Используйте nil для NULL.

: null - Разрешает или запрещает значения NULL в столбце. Этот параметр можно было бы назвать: null_allowed.

В первом варианте, если вы ничего не укажете, рельсы будут устанавливать значение true. Во втором варианте оно будет иметь значение null. В третьем варианте оба применяются, значения могут быть true, false и nil

Ответ 3

Чтобы ответить на вопрос OP:

Имеет ли смысл следующее?

t.boolean :test, :default => true, :null => false

Конечно, давайте посмотрим на возможные события SQL. (Имейте в виду, что установленный вами параметр по default вступает в силу в операторах INSERT INTO таких как следующее.)

INSERT INTO table_name id, test VALUES 1, NULL; # This should raise an error
INSERT INTO table_name id VALUES 1;             # This will default test column value to true

Таким образом, это может иметь смысл - если вы хотите явно запретить значения NULL (при попытке сделать прямое значение NULL напрямую), а также вы хотите, чтобы укоренить отсутствующие или отсутствующие значения в столбце test в true во время INSERT INTO,