diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
index 9e38a717bbe5ac67f5d1bef0d1712210abf99959..d2f6dff16c4c210c7d8e5784a782dddc741cbc25 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
@@ -53,6 +53,7 @@ import java.util.logging.Logger;
 import javax.annotation.Nullable;
 
 import static java.sql.Types.INTEGER;
+import static java.util.Collections.singletonList;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 import static org.briarproject.bramble.api.db.Metadata.REMOVE;
@@ -74,7 +75,7 @@ import static org.briarproject.bramble.db.ExponentialBackoff.calculateExpiry;
 abstract class JdbcDatabase implements Database<Connection> {
 
 	// Package access for testing
-	static final int CODE_SCHEMA_VERSION = 38;
+	static final int CODE_SCHEMA_VERSION = 39;
 
 	// Rotation period offsets for incoming transport keys
 	private static final int OFFSET_PREV = -1;
@@ -389,7 +390,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 
 	// Package access for testing
 	List<Migration<Connection>> getMigrations() {
-		return Collections.emptyList();
+		return singletonList(new Migration38_39());
 	}
 
 	private void storeSchemaVersion(Connection txn, int version)
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Migration38_39.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Migration38_39.java
new file mode 100644
index 0000000000000000000000000000000000000000..2febcb1dc506208ea6f89ad09cb3babc5313975c
--- /dev/null
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Migration38_39.java
@@ -0,0 +1,54 @@
+package org.briarproject.bramble.db;
+
+import org.briarproject.bramble.api.db.DbException;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.logging.Logger;
+
+import javax.annotation.Nullable;
+
+import static java.util.logging.Level.WARNING;
+
+class Migration38_39 implements Migration<Connection> {
+
+	private static final Logger LOG =
+			Logger.getLogger(Migration38_39.class.getName());
+
+	@Override
+	public int getStartVersion() {
+		return 38;
+	}
+
+	@Override
+	public int getEndVersion() {
+		return 39;
+	}
+
+	@Override
+	public void migrate(Connection txn) throws DbException {
+		Statement s = null;
+		try {
+			s = txn.createStatement();
+			// Add not null constraints
+			s.execute("ALTER TABLE outgoingKeys"
+					+ " ALTER COLUMN contactId"
+					+ " SET NOT NULL");
+			s.execute("ALTER TABLE incomingKeys"
+					+ " ALTER COLUMN contactId"
+					+ " SET NOT NULL");
+		} catch (SQLException e) {
+			tryToClose(s);
+			throw new DbException(e);
+		}
+	}
+
+	private void tryToClose(@Nullable Statement s) {
+		try {
+			if (s != null) s.close();
+		} catch (SQLException e) {
+			if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
+		}
+	}
+}