В чем разница между значением по умолчанию и значением 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
,