diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
index 8368694..2bb5c1f 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
@@ -1080,7 +1080,17 @@ protected function mapToStorageRecord(ContentEntityInterface $entity, $table_nam
           $value = $entity->$field_name->first()->getValue();
         }
         else {
-          $value = isset($entity->$field_name->$column_name) ? $entity->$field_name->$column_name : NULL;
+          if (isset($entity->$field_name->$column_name)) {
+            $value = $entity->$field_name->$column_name;
+          }
+          else {
+            // If no value has been set for a new entity, do not save NULL
+            // values but instead let the schema defaults apply.
+            if ($entity->isNew()) {
+              continue;
+            }
+            $value = NULL;
+          }
         }
         if (!empty($definition->getSchema()['columns'][$column_name]['serialize'])) {
           $value = serialize($value);
diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
index dac6584..85980e5 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
@@ -1415,10 +1415,14 @@ protected function getSharedTableFieldSchema(FieldStorageDefinitionInterface $st
       // table. For this reason the revision ID field cannot be marked as NOT
       // NULL.
       unset($keys['label'], $keys['revision']);
-      // Key fields may not be NULL.
-      if (in_array($field_name, $keys)) {
-        $schema['fields'][$schema_field_name]['not null'] = TRUE;
-      }
+
+      // Only key fields may not be NULL, all the other columns have to be able
+      // to be NULL regardless of the actual field storage schema in order to
+      // support adding a base field definition to an entity type with non-empty
+      // base table(s).
+      // @todo Revisit the strict 'not null' => FALSE requirement for all
+      // non-key columns in https://www.drupal.org/node/2346019.
+      $schema['fields'][$schema_field_name]['not null'] = in_array($field_name, $keys) ? TRUE : FALSE;
     }
 
     if (!empty($field_schema['indexes'])) {
