Ошибку выдает потому, что запрос на вставку gender ('insert or ignore') пытается использовать ключи, а в таблице они не заданы.
Например, так
CREATE TABLE IF NOT EXISTS gender(gender text primary key)
В остальном по структуре. Если все же делаете реляционную модель, то в таблице студентов должны храниться id из этих справочных таблиц (groupp, teacher и т.д.), а не сами значения. Тогда это позволит поддерживать уникальность значений, позволять использовать выбор значений из справочников (которыми и будут эти таблицы gender, teacher и т.д.).
Пример, для учителя не просто таблица с teacher text, а таблица с ключевым полем, которое и используется для связки с таблицей студентов и остальными редактируемыми полями.
CREATE TABLE IF NOT EXISTS teacher(
teacher integer primary key,
teacher_name text)
Тогда по учителю можно будет добавлять и другие поля, характеризующие его, менять само имя(название/фамилию), при этом не нарушая связь по ключу с таблицей студентов. Выбор каждого поля для таблицы студентов будет выбором из текущих значений соответствующей справочной таблицы, а не ввод вручную.
Если же полноценная реляционная модель не нужна, то нет и смысла делать отдельную таблицу под каждую сущность (они по факту не будут использоваться), можно все хранить напрямую в таблице студентов.