Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3788111
А
Аноним
22 часа назад · публичный вопрос
А
Аноним

https://github.com/WorldOfPets/share база данных таблицу надо создать и сделать от начала до конца

Ответ нейросети
22 часа назад

Коротко: нужен файл university.sqlite с пятью таблицами. Создай его в DB Browser, закрой окно из первого фото кнопкой «Отмена», открой вкладку Execute SQL, выполни скрипт ниже и нажми Write Changes (Ctrl+S). SQLite хранит всю базу в одном файле.

1. Создаём файл базы

  1. File → New Database или кнопка New Database.
  2. Выбери папку, например C:\db_practice.
  3. Имя файла: university.sqlite.
  4. В окне создания таблицы нажми Cancel.
  5. Убедись, что в заголовке появилось university.sqlite.

2. Создаём таблицы

Выполни этот скрипт во вкладке Execute SQL:

PRAGMA foreign_keys = ON;

CREATE TABLE "groups" (
    group_id INTEGER PRIMARY KEY AUTOINCREMENT,
    group_name TEXT NOT NULL,
    course INTEGER NOT NULL
);

CREATE TABLE teachers (
    teacher_id INTEGER PRIMARY KEY AUTOINCREMENT,
    last_name TEXT NOT NULL,
    first_name TEXT NOT NULL,
    middle_name TEXT,
    department TEXT NOT NULL
);

CREATE TABLE subjects (
    subject_id INTEGER PRIMARY KEY AUTOINCREMENT,
    subject_name TEXT NOT NULL,
    hours INTEGER NOT NULL
);

CREATE TABLE students (
    student_id INTEGER PRIMARY KEY AUTOINCREMENT,
    last_name TEXT NOT NULL,
    first_name TEXT NOT NULL,
    group_id INTEGER NOT NULL,
    FOREIGN KEY (group_id) REFERENCES "groups"(group_id)
);

CREATE TABLE grades (
    grade_id INTEGER PRIMARY KEY AUTOINCREMENT,
    student_id INTEGER NOT NULL,
    subject_id INTEGER NOT NULL,
    teacher_id INTEGER NOT NULL,
    grade INTEGER NOT NULL CHECK (grade BETWEEN 2 AND 5),
    grade_date TEXT NOT NULL,
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (subject_id) REFERENCES subjects(subject_id),
    FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id)
);

Порядок важен: сначала groups, затем students, а grades — последней, потому что она ссылается на остальные таблицы.

3. Добавляем данные

Ниже — демонстрационные данные, в том числе четверо студентов с фото. Данные из репозитория замени на свои.

INSERT INTO "groups" (group_id, group_name, course) VALUES
(1, 'Группа 1', 1),
(2, 'Группа 2', 1);

INSERT INTO teachers (teacher_id, last_name, first_name, middle_name, department) VALUES
(1, 'Смирнов', 'Иван', 'Петрович', 'Кафедра ИТ');

INSERT INTO subjects (subject_id, subject_name, hours) VALUES
(1, 'Базы данных', 80),
(2, 'Математика', 120);

INSERT INTO students (student_id, last_name, first_name, group_id) VALUES
(1, 'Иванов', 'Алексей', 1),
(2, 'Петрова', 'Мария', 1),
(3, 'Сидоров', 'Дмитрий', 1),
(4, 'Кузнецова', 'Анна', 2);

INSERT INTO grades (grade_id, student_id, subject_id, teacher_id, grade, grade_date) VALUES
(1, 1, 1, 1, 5, '2026-11-05'),
(2, 2, 1, 1, 4, '2026-11-06'),
(3, 3, 2, 1, 3, '2026-11-07');

После этого обязательно нажми Write Changes или Ctrl+S.

4. Проверка

Проверь ключи:

PRAGMA foreign_key_check;
PRAGMA integrity_check;

foreign_key_check должен вернуть пустой результат, а integrity_check — ok.

Проверь данные:

SELECT
    s.last_name || ' ' || s.first_name AS student,
    g.group_name,
    sub.subject_name,
    t.last_name AS teacher,
    gr.grade,
    gr.grade_date
FROM grades AS gr
JOIN students AS s ON s.student_id = gr.student_id
JOIN "groups" AS g ON g.group_id = s.group_id
JOIN subjects AS sub ON sub.subject_id = gr.subject_id
JOIN teachers AS t ON t.teacher_id = gr.teacher_id
ORDER BY gr.grade_date;

Должно вывести три оценки с фамилиями студентов, группами, предметами и преподавателями.

Что важно понять

  • PK — первичный ключ, уникальный номер строки, например student_id.
  • FK — внешний ключ, ссылка на строку другой таблицы, например students.group_id ссылается на groups.group_id.
  • Связь \(1:\infty\) работает так: одна группа — много студентов; один студент — много оценок. Поэтому group_id хранится в students, а не наоборот.
  • grades — связующая таблица: каждая строка — одна оценка, у которой есть один студент, один предмет и один преподаватель.
  • Название группы хранится один раз в groups; в students только group_id. Так нет дублирования и противоречий.
  • PRAGMA foreign_keys = ON включает проверку ссылок. Без неё SQLite по умолчанию может разрешить вставить оценку для несуществующего студента.
  • CHECK (grade BETWEEN 2 AND 5) не даст поставить оценку 1 или 6.

Если в репозитории WorldOfPets/share есть готовый файл .sqlite, открой его через Open Database; если .sql — выполни его через Execute SQL; если .csv — импортируй через File → Import → Table from CSV file.

Обсуждение

48 сообщений
А
Аноним

Что надо сделать и куда надо расставить галочки

Нейросеть22 часа назад

Галочки ставятся в окне Create Table — оно открывается на вкладке Database Structure кнопкой Create Table. Если ты закрыл его кнопкой «Отмена», просто открой заново.

В окне для каждой строки-поля есть столбцы:

  • NN — NOT NULL, поле обязательное;
  • PK — PRIMARY KEY, главный ключ таблицы;
  • AI — AUTOINCREMENT, автонумерация;
  • U — UNIQUE, уникальное значение (нам нигде не нужно);
  • Default — оставь пустым;
  • Check — условие-проверка (необязательно).

Важно: PK ставится только у одного поля, а AI — только у поля с PK и типом INTEGER.

Таблица groups

Поле Тип NN PK AI U
group_id INTEGER ✓ ✓ ✓ —
group_name TEXT ✓ — — —
course INTEGER ✓ — — —

Таблица teachers

Поле Тип NN PK AI U
teacher_id INTEGER ✓ ✓ ✓ —
last_name TEXT ✓ — — —
first_name TEXT ✓ — — —
middle_name TEXT — — — —
department TEXT ✓ — — —

Таблица subjects

Поле Тип NN PK AI U
subject_id INTEGER ✓ ✓ ✓ —
subject_name TEXT ✓ — — —
hours INTEGER ✓ — — —

Таблица students

Поле Тип NN PK AI U
student_id INTEGER ✓ ✓ ✓ —
last_name TEXT ✓ — — —
first_name TEXT ✓ — — —
group_id INTEGER ✓ — — —

Таблица grades

Поле Тип NN PK AI U
grade_id INTEGER ✓ ✓ ✓ —
student_id INTEGER ✓ — — —
subject_id INTEGER ✓ — — —
teacher_id INTEGER ✓ — — —
grade INTEGER ✓ — — —
grade_date TEXT ✓ — — —

У поля grade в столбце Check можно написать grade BETWEEN 2 AND 5 — тогда оценка 1 или 6 не запишется.

Внешние ключи — это не галочки

В окне Create Table галочек для FOREIGN KEY нет. Создай все пять таблиц, затем:

  1. Правой кнопкой по таблице → Modify Table...
  2. Вкладка Foreign Keys → Add.
  3. Заполни строку: колонка текущей таблицы → родительская таблица → её колонка.

Для students:

Column Table Column
group_id groups group_id

Для grades — три строки:

Column Table Column
student_id students student_id
subject_id subjects subject_id
teacher_id teachers teacher_id

Делай это, пока таблицы пустые: Modify Table пересоздаёт таблицу, и с данными могут быть сложности.

Ещё два действия

  • Вкладка Edit Pragmas → Foreign Keys → выбери Yes → Save. Иначе SQLite не будет проверять ссылки.
  • Нажми Write Changes или Ctrl+S, иначе изменения останутся только в памяти.

Проверка

На вкладке Database Structure должно быть пять таблиц. Выполни в Execute SQL:

PRAGMA foreign_key_check;
PRAGMA integrity_check;

Первая команда должна вернуть пусто, вторая — ok.

Если возиться с галочками долго, напомню: SQL-скрипт из предыдущего сообщения создаёт всё то же самое сразу, и внешние ключи в нём уже прописаны. Галочки нужны только для ручного режима.

А
Аноним

Что писать тут

Нейросеть22 часа назад

Ты в окне создания таблицы groups (SQLiteStudio). Сейчас там стоит заглушка Field1 — её нужно заменить на настоящие поля. Впиши три строки.

Что заполнить в таблице groups

Имя Тип НП ПК АИ У По умолчанию Проверить
group_id INTEGER ✓ ✓ ✓ — пусто пусто
group_name TEXT ✓ — — — пусто пусто
course INTEGER ✓ — — — пусто пусто

Расшифровка столбцов: НП — NOT NULL, ПК — PRIMARY KEY, АИ — AUTOINCREMENT, У — UNIQUE.

По шагам

  1. В первой строке в столбце Имя сотри Field1 и напиши group_id. Тип оставь INTEGER.
  2. Поставь галочки НП, ПК, АИ.
  3. Нажми Add — появится вторая строка. Имя: group_name, тип: TEXT (выбери в выпадающем списке), галочку НП.
  4. Ещё раз Add: имя course, тип INTEGER, галочка НП.
  5. Внизу в окне предпросмотра должно получиться так:
CREATE TABLE "groups" (
    "group_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "group_name" TEXT NOT NULL,
    "course" INTEGER NOT NULL
);

Если предпросмотр совпал — нажми OK, затем сохрани изменения (Ctrl+S или кнопка сохранения в тулбаре).

Важные моменты

  • АИ ставится только у group_id — это поле-счётчик, которое само нумерует строки.
  • Вкладка Foreign Keys для groups остаётся пустой: это родительская таблица, на неё ссылаются другие, а сама она ни на кого не ссылается.
  • Вкладка Check Constraints для groups тоже пустая.
  • Не оставляй Field1: позже понадобится поле group_id, чтобы привязать к группе студентов. Если поле называется иначе, ссылка из students не сработает.

Остальные таблицы заполняются по той же схеме — поля и галочки я приводил в предыдущем сообщении. Если хочешь вообще пропустить ручное заполнение, открой вкладку Execute SQL и выполни готовый скрипт оттуда — он создаст все пять таблиц сразу.

А
Аноним

Так или нет

Нейросеть22 часа назад

Да, всё верно. Придирок нет.

Что видно на фото:

  • group_id — INTEGER, стоят НП, ПК, АИ — это и есть автоинкрементный первичный ключ;
  • group_name — TEXT, только НП;
  • course — INTEGER, только НП;
  • У нигде не отмечен — правильно, уникальность нам не нужна.

Предпросмотр снизу тоже правильный:

CREATE TABLE "groups" (
    "group_id" INTEGER NOT NULL,
    "group_name" TEXT NOT NULL,
    "course" INTEGER NOT NULL,
    PRIMARY KEY ("group_id" AUTOINCREMENT)
);

То, что ключ записан отдельной строкой PRIMARY KEY (...), а не рядом с полем, — просто другой способ записи, для SQLite это одно и то же. AUTOINCREMENT привязан к group_id типа INTEGER — главное условие выполнено.

Дальше

  1. Жми OK.
  2. Сохрани изменения — Ctrl+S или кнопка сохранения. Без этого таблица останется только в памяти.
  3. Создай остальные четыре таблицы по той же схеме:
Таблица Поля
teachers teacher_id INTEGER (НП, ПК, АИ); last_name TEXT (НП); first_name TEXT (НП); middle_name TEXT (без галочек); department TEXT (НП)
subjects subject_id INTEGER (НП, ПК, АИ); subject_name TEXT (НП); hours INTEGER (НП)
students student_id INTEGER (НП, ПК, АИ); last_name TEXT (НП); first_name TEXT (НП); group_id INTEGER (НП)
grades grade_id INTEGER (НП, ПК, АИ); student_id INTEGER (НП); subject_id INTEGER (НП); teacher_id INTEGER (НП); grade INTEGER (НП); grade_date TEXT (НП)
  1. У grade в столбце Проверить можно вписать grade BETWEEN 2 AND 5.
  2. Вкладку Foreign Keys для groups не трогай — она родительская.

Внешние ключи добавляем после создания всех пяти таблиц, через правую кнопку по таблице → Modify Table... → вкладка Foreign Keys. Пока таблицы пустые, это делается без риска для данных.

Пришли следующее фото, когда дойдёшь до students или grades, — проверю связь.

А
Аноним

Так или нет

Нейросеть22 часа назад

Да, так правильно. Все три поля и галочки стоят верно, и предпросмотр снизу это подтверждает:

CREATE TABLE "groups" (
    "group_id" INTEGER NOT NULL,
    "group_name" TEXT NOT NULL,
    "course" INTEGER NOT NULL,
    PRIMARY KEY ("group_id" AUTOINCREMENT)
);

Что проверено:

  • group_id — INTEGER, НП + ПК + АИ: автоинкрементный первичный ключ;
  • group_name — TEXT, только НП;
  • course — INTEGER, только НП;
  • У нигде не отмечен, «По умолчанию» и «Проверить» пустые — так и нужно;
  • Foreign Keys и Check Constraints для groups остаются пустыми: это родительская таблица.

Дальше

  1. Жми OK.
  2. Сохрани изменения — Ctrl+S или кнопка сохранения. Без сохранения таблица останется только в памяти.
  3. Создай остальные четыре таблицы по той же схеме:
Таблица Поля
teachers teacher_id INTEGER (НП, ПК, АИ); last_name TEXT (НП); first_name TEXT (НП); middle_name TEXT (без галочек); department TEXT (НП)
subjects subject_id INTEGER (НП, ПК, АИ); subject_name TEXT (НП); hours INTEGER (НП)
students student_id INTEGER (НП, ПК, АИ); last_name TEXT (НП); first_name TEXT (НП); group_id INTEGER (НП)
grades grade_id INTEGER (НП, ПК, АИ); student_id INTEGER (НП); subject_id INTEGER (НП); teacher_id INTEGER (НП); grade INTEGER (НП); grade_date TEXT (НП)
  1. У grade в столбце Проверить впиши grade BETWEEN 2 AND 5 — оценка 1 или 6 не запишется.

Про связи — главное

Пока создаём таблицы, у students и grades поля group_id, student_id, subject_id, teacher_id — просто числа. Связи добавляются отдельно, во вкладке Foreign Keys, и делать это надо после создания всех пяти таблиц, пока они пустые:

Таблица Колонка Ссылается на таблицу На колонку
students group_id groups group_id
grades student_id students student_id
grades subject_id subjects subject_id
grades teacher_id teachers teacher_id

Без этих строк база создастся, но не будет следить за целостностью: можно будет вписать оценку студенту, которого нет.

Пришли фото students или grades — проверю поля.

А
Аноним

Нак назвать где написано таблица

Нейросеть22 часа назад

В поле «Таблица» пишется имя самой таблицы, а не поля. Сейчас там стоит groups — это правильно, менять не нужно.

На фото всё уже верно: три поля, галочки НП/ПК/АИ на group_id, предпросмотр снизу корректный. Жми OK и сохрани (Ctrl+S).

Как называть дальше

Что создаёшь Имя в поле «Таблица»
группы groups
преподаватели teachers
предметы subjects
студенты students
оценки grades

Правила для имён:

  • латиница, строчные буквы — students, а не Студенты;
  • без пробелов: если нужно два слова, пиши через подчёркивание — grade_book;
  • имя во множественном числе — таблица хранит много строк;
  • имя таблицы не должно совпадать с именем поля.

Не путай два названия

  • практическая.db в заголовке окна — это файл базы данных, один на всю работу. Он у тебя уже создан.
  • groups, teachers … — это таблицы внутри этого файла. Их будет пять, и все лежат в одном файле.

То есть новые таблицы создаются не новыми файлами, а той же кнопкой Создать таблицу внутри открытой базы. В поле «Таблица» каждый раз пишешь новое имя из таблицы выше, а поля и галочки — по схеме из предыдущего сообщения.

Пришли фото students — проверю поля и подскажу, когда переходить к связям.

А
Аноним

После 1 2 какая таблица будет ч галочками их нужно 5

Нейросеть22 часа назад

Третья таблица — subjects. Порядок такой, и он не случайный: таблица может ссылаться только на уже существующую, поэтому оценки (grades) идут последними.

№ Имя в поле «Таблица» Что хранит
1 groups группы
2 teachers преподаватели
3 subjects предметы
4 students студенты
5 grades оценки

3. subjects — делай сейчас

Имя Тип НП ПК АИ У
subject_id INTEGER ✓ ✓ ✓ —
subject_name TEXT ✓ — — —
hours INTEGER ✓ — — —

«По умолчанию» и «Проверить» — пусто. Foreign Keys и Check Constraints — пусто. Жми OK, затем Ctrl+S.

4. students — следующая

Имя Тип НП ПК АИ У
student_id INTEGER ✓ ✓ ✓ —
last_name TEXT ✓ — — —
first_name TEXT ✓ — — —
group_id INTEGER ✓ — — —

Здесь group_id — пока просто число, связь добавим после пятой таблицы.

5. grades — последняя

Имя Тип НП ПК АИ У
grade_id INTEGER ✓ ✓ ✓ —
student_id INTEGER ✓ — — —
subject_id INTEGER ✓ — — —
teacher_id INTEGER ✓ — — —
grade INTEGER ✓ — — —
grade_date TEXT ✓ — — —

У поля grade в столбце «Проверить» впиши grade BETWEEN 2 AND 5.

Что важно не перепутать

  • В поле «Таблица» — имя таблицы (subjects), а имена полей — в столбце «Имя».
  • ПК и АИ — только у поля с _id и типом INTEGER, у остальных полей этих галочек нет.
  • middle_name в teachers — единственное поле без НП, потому что отчество может отсутствовать.
  • Все пять таблиц лежат в одном файле практическая.db. Новая таблица — это снова кнопка Создать таблицу, а не новый файл.
  • После каждой таблицы — OK и Ctrl+S.

Когда будут готовы все пять, добавим связи через Modify Table → Foreign Keys: students.group_id → groups.group_id, grades.student_id → students.student_id, grades.subject_id → subjects.subject_id, grades.teacher_id → teachers.teacher_id. Пришли фото, когда дойдёшь до grades, — проверю.

А
Аноним

Помоему есть 2 таблице какую дальше писать

Нейросеть22 часа назад

Нет, создана пока одна таблица — groups. Вторая, sqlite_sequence, — служебная: SQLite создаёт её сам, как только появляется поле с AUTOINCREMENT. Она хранит последний номер и нужна для автонумерации. Её не создают, не трогают и в свои пять таблиц не считают.

Твои пять: groups ✓ → teachers → subjects → students → grades.

Следующая — teachers

В поле «Таблица» напиши teachers, поля и галочки такие:

Имя Тип НП ПК АИ У
teacher_id INTEGER ✓ ✓ ✓ —
last_name TEXT ✓ — — —
first_name TEXT ✓ — — —
middle_name TEXT — — — —
department TEXT ✓ — — —

«По умолчанию», «Проверить», Foreign Keys и Check Constraints — пусто. Дальше OK и Ctrl+S.

На что обратить внимание

  • middle_name — единственное поле без НП: отчества может не быть.
  • В поле «Таблица» только teachers, а teacher_id и остальные — в столбце «Имя».
  • После сохранения в «Схема БД» появится Таблицы (3): groups, teachers, sqlite_sequence. То есть настоящих таблиц будет две, а третья строка — всё та же служебная.
  • В самом конце, когда все пять будут готовы, в списке окажется Таблицы (6) — пять твоих плюс sqlite_sequence.

Пришли фото следующей — проверю.

А
Аноним

Так?

Нейросеть22 часа назад

Почти. Одна опечатка: в первой строке написано heacher_id вместо teacher_id — лишняя «h» и потерялась «t». Исправь, пока таблица не сохранена: кликни по имени, сотри и впиши teacher_id. В предпросмотре должно стать:

CREATE TABLE "teachers" (
    "teacher_id" INTEGER NOT NULL,
    "last_name" TEXT NOT NULL,
    "first_name" TEXT NOT NULL,
    "middle_name" TEXT,
    "department" TEXT NOT NULL,
    PRIMARY KEY ("teacher_id" AUTOINCREMENT)
);

Остальное верно:

  • teacher_id — INTEGER, НП + ПК + АИ;
  • last_name, first_name — TEXT, только НП;
  • middle_name — TEXT, ни одной галочки (отчества может не быть) — так и стоит;
  • department — TEXT, НП (курсор просто наведён на галочку);
  • У, «По умолчанию», «Проверить» — пусто.

Почему имя важно: позже в grades появится поле teacher_id, и связь настраивается по совпадению имён колонок. С heacher_id внешний ключ просто не к чему будет привязать, придётся переделывать таблицу.

Дальше

  1. Исправь имя, жми OK.
  2. Ctrl+S — сохранить.
  3. Создавай третью таблицу — subjects:
Имя Тип НП ПК АИ У
subject_id INTEGER ✓ ✓ ✓ —
subject_name TEXT ✓ — — —
hours INTEGER ✓ — — —

В «Схема БД» после сохранения должно быть Таблицы (4): groups, teachers, subjects и служебная sqlite_sequence.

Кстати, my_db.sqbpro в заголовке — это файл проекта SQLiteStudio, а сама база — практическая.db. Для сдачи нужен именно файл .db.

А
Аноним

Так

Нейросеть22 часа назад

Почти — галочки и типы теперь верные: teacher_id INTEGER (НП, ПК, АИ), last_name/first_name/department — TEXT с НП, middle_name — TEXT вообще без галочек.

Но в предпросмотре насторожила одна вещь: там написано " teacher_id" — с пробелом после кавычки, а у last_name пробела нет. Похоже, при исправлении опечатки в начало имени затесался пробел.

Проверь имя

  1. Кликни в поле Имя у первой строки.
  2. Поставь курсор в самое начало, перед t, и нажми Backspace один раз.
  3. В предпросмотре должно стать ровно так:
CREATE TABLE "teachers" (
    "teacher_id" INTEGER NOT NULL,
    "last_name" TEXT NOT NULL,
    "first_name" TEXT NOT NULL,
    "middle_name" TEXT,
    "department" TEXT NOT NULL,
    PRIMARY KEY ("teacher_id" AUTOINCREMENT)
);

Если пробела не было — ничего не изменится, просто идём дальше.

Почему это важно: позже в grades будет поле teacher_id, и связь строится по точному совпадению имён. С пробелом внутри имени внешний ключ не найдёт нужную колонку, и таблицу придётся пересоздавать.

Дальше

Жми OK, затем Ctrl+S. Создавай третью таблицу — subjects:

Имя Тип НП ПК АИ У
subject_id INTEGER ✓ ✓ ✓ —
subject_name TEXT ✓ — — —
hours INTEGER ✓ — — —

В поле «Таблица» — subjects. «По умолчанию», «Проверить», Foreign Keys и Check Constraints — пусто.

После сохранения в «Схема БД» должно быть Таблицы (4): groups, teachers, subjects и служебная sqlite_sequence.

А
Аноним

Правильно или нет

Нейросеть22 часа назад

Почти правильно — все типы и галочки верные:

  • teacher_id — INTEGER, НП + ПК + АИ;
  • last_name, first_name, department — TEXT с НП;
  • middle_name — TEXT без галочек;
  • У, «По умолчанию», «Проверить» — пусто.

Одна ошибка — пробел в имени

В предпросмотре видно: " teacher_id" — пробел после кавычки. В строке 2 и в строке 7. У остальных полей его нет, значит он попал в само имя поля.

Исправь так: кликни в поле «Имя» первой строки, поставь курсор в самое начало (перед t) и нажми Backspace. В предпросмотре должно стать:

CREATE TABLE "teachers" (
    "teacher_id" INTEGER NOT NULL,
    "last_name" TEXT NOT NULL,
    "first_name" TEXT NOT NULL,
    "middle_name" TEXT,
    "department" TEXT NOT NULL,
    PRIMARY KEY ("teacher_id" AUTOINCREMENT)
);

Почему это критично: в grades будет поле teacher_id, и связь ищется по точному совпадению имён. Колонка " teacher_id" (с пробелом) с teacher_id не совпадёт — внешний ключ не создастся, и таблицу придётся переделывать заново.

Заодно: окно у тебя называется «Редактирование определения таблицы» — значит, teachers уже была создана. Это не страшно, таблица пустая, при OK она просто пересоздастся. Главное — после OK нажать Ctrl+S.

Дальше — третья таблица subjects

В поле «Таблица» — subjects:

Имя Тип НП ПК АИ У
subject_id INTEGER ✓ ✓ ✓ —
subject_name TEXT ✓ — — —
hours INTEGER ✓ — — —

«По умолчанию», «Проверить», Foreign Keys и Check Constraints — пусто. После сохранения в «Схема БД» будет Таблицы (4): groups, teachers, subjects и служебная sqlite_sequence.

Теперь лучше создавай таблицы через Создать таблицу, а не через «Редактировать»: на создание SQLiteStudio сама проверяет имена, и опечатку видно сразу.

А
Аноним

Так?

Нейросеть22 часа назад

Да, теперь всё правильно. Пробел из имени ушёл — в предпросмотре чисто:

CREATE TABLE "teachers" (
    "teacher_id" INTEGER NOT NULL,
    "last_name" TEXT NOT NULL,
    "first_name" TEXT NOT NULL,
    "middle_name" TEXT,
    "department" TEXT NOT NULL,
    PRIMARY KEY ("teacher_id" AUTOINCREMENT)
);

Сверка по галочкам:

  • teacher_id — INTEGER, НП + ПК + АИ;
  • last_name, first_name, department — TEXT, только НП;
  • middle_name — TEXT, без галочек;
  • У, «По умолчанию», «Проверить» — пусто.

Жми OK и сразу Ctrl+S, иначе изменения останутся только в памяти.

Третья таблица — subjects

Кнопка Создать таблицу, в поле «Таблица» — subjects:

Имя Тип НП ПК АИ У
subject_id INTEGER ✓ ✓ ✓ —
subject_name TEXT ✓ — — —
hours INTEGER ✓ — — —

«По умолчанию», «Проверить», Foreign Keys и Check Constraints — пусто. После OK и Ctrl+S в «Схема БД» будет Таблицы (4): groups, teachers, subjects и служебная sqlite_sequence.

Что осталось после неё

  1. students — student_id (INTEGER, НП+ПК+АИ), last_name (TEXT, НП), first_name (TEXT, НП), group_id (INTEGER, НП).
  2. grades — grade_id (INTEGER, НП+ПК+АИ), student_id, subject_id, teacher_id, grade, grade_date (все НП). У grade в «Проверить»: grade BETWEEN 2 AND 5.

Потом — связи через Modify Table → Foreign Keys и заполнение данными. Пока таблицы пустые, связи правятся без риска.

Принцип, который здесь работает: таблица может ссылаться только на уже существующую, поэтому groups → teachers → subjects → students → grades, а не наоборот. Пришли фото subjects — проверю.

А
Аноним

Правильно

Нейросеть22 часа назад

Да, всё правильно. Таблица subjects заполнена верно:

  • subject_id — INTEGER, НП + ПК + АИ;
  • subject_name — TEXT, только НП;
  • hours — INTEGER, только НП;
  • У, «По умолчанию», «Проверить», Collation — пусто.

Предпросмотр тоже чистый, без лишних пробелов в именах:

CREATE TABLE "subjects" (
    "subject_id" INTEGER NOT NULL,
    "subject_name" TEXT NOT NULL,
    "hours" INTEGER NOT NULL,
    PRIMARY KEY ("subject_id" AUTOINCREMENT)
);

Жми OK и сразу Ctrl+S. В «Схема БД» должно стать Таблицы (4): groups, teachers, subjects и служебная sqlite_sequence.

Четвёртая таблица — students

Кнопка Создать таблицу, в поле «Таблица» — students:

Имя Тип НП ПК АИ У
student_id INTEGER ✓ ✓ ✓ —
last_name TEXT ✓ — — —
first_name TEXT ✓ — — —
group_id INTEGER ✓ — — —

«По умолчанию», «Проверить», Foreign Keys и Check Constraints — пусто. group_id здесь пока просто число — связь с groups добавим после пятой таблицы.

Пятая — grades, уже после students

Имя Тип НП ПК АИ У
grade_id INTEGER ✓ ✓ ✓ —
student_id INTEGER ✓ — — —
subject_id INTEGER ✓ — — —
teacher_id INTEGER ✓ — — —
grade INTEGER ✓ — — —
grade_date TEXT ✓ — — —

У grade в столбце «Проверить» впиши grade BETWEEN 2 AND 5.

Пришли фото students — проверю и подскажу про связи.

А
Аноним

Правильно

Нейросеть22 часа назад

Да, правильно. Таблица students заполнена точно по схеме:

  • student_id — INTEGER, НП + ПК + АИ;
  • last_name — TEXT, только НП;
  • first_name — TEXT, только НП;
  • group_id — INTEGER, только НП (галочка НП отмечена);
  • У, «По умолчанию», «Проверить», Collation — пусто.

Предпросмотр чистый, лишних пробелов в именах нет:

CREATE TABLE "students" (
    "student_id" INTEGER NOT NULL,
    "last_name" TEXT NOT NULL,
    "first_name" TEXT NOT NULL,
    "group_id" INTEGER NOT NULL,
    PRIMARY KEY ("student_id" AUTOINCREMENT)
);

Жми OK и сразу Ctrl+S. В «Схема БД» станет Таблицы (4): groups, teachers, subjects, students и служебная sqlite_sequence.

Последняя — grades

Кнопка Создать таблицу, в поле «Таблица» — grades:

Имя Тип НП ПК АИ У
grade_id INTEGER ✓ ✓ ✓ —
student_id INTEGER ✓ — — —
subject_id INTEGER ✓ — — —
teacher_id INTEGER ✓ — — —
grade INTEGER ✓ — — —
grade_date TEXT ✓ — — —

У поля grade в столбце «Проверить» впиши grade BETWEEN 2 AND 5 — это не даст поставить оценку 1 или 6.

После OK и Ctrl+S будет Таблицы (6) — все пять твоих плюс служебная.

Потом останется два дела: связи через Modify Table → Foreign Keys и загрузка данных. Пришли фото grades — проверю.

А
Аноним

Правильно

Нейросеть22 часа назад

Да, правильно. На фото всё верно:

  • student_id — INTEGER, НП + ПК + АИ;
  • last_name — TEXT, НП;
  • first_name — TEXT, НП;
  • group_id — INTEGER, НП;
  • У, «По умолчанию», «Проверить» — пусто.

Предпросмотр чистый, без лишних пробелов:

CREATE TABLE "students" (
    "student_id" INTEGER NOT NULL,
    "last_name" TEXT NOT NULL,
    "first_name" TEXT NOT NULL,
    "group_id" INTEGER NOT NULL,
    PRIMARY KEY ("student_id" AUTOINCREMENT)
);

Жми OK и сразу Ctrl+S.

Осталась последняя таблица — grades

Кнопка Создать таблицу, в поле «Таблица» — grades:

Имя Тип НП ПК АИ У
grade_id INTEGER ✓ ✓ ✓ —
student_id INTEGER ✓ — — —
subject_id INTEGER ✓ — — —
teacher_id INTEGER ✓ — — —
grade INTEGER ✓ — — —
grade_date TEXT ✓ — — —

У поля grade в столбце «Проверить» впиши: grade BETWEEN 2 AND 5.

После OK и Ctrl+S в «Схема БД» будет Таблицы (6) — пять твоих и служебная sqlite_sequence.

Пришли фото grades — проверю поля и подскажу, как расставить внешние ключи.

А
Аноним

Правильно ?

Нейросеть22 часа назад

Да, всё правильно. Поля и галочки расставлены верно:

  • grade_id — INTEGER, НП + ПК + АИ;
  • student_id, subject_id, teacher_id, grade — INTEGER, только НП;
  • grade_date — TEXT, только НП;
  • У и «По умолчанию» — пусто.

Предпросмотр снизу полностью совпадает со схемой:

CREATE TABLE "grades" (
    "grade_id" INTEGER NOT NULL,
    "student_id" INTEGER NOT NULL,
    "subject_id" INTEGER NOT NULL,
    "teacher_id" INTEGER NOT NULL,
    "grade" INTEGER NOT NULL,
    "grade_date" TEXT NOT NULL,
    PRIMARY KEY ("grade_id" AUTOINCREMENT)
);

Один необязательный момент

В столбце «Проверить» у поля grade пусто. Если хочешь защиту от оценок 1 или 6, впиши туда grade BETWEEN 2 AND 5. Если не впишешь — база создастся точно так же, просто оценку 6 можно будет записать вручную.

Дальше

  1. Жми OK и сразу Ctrl+S.
  2. В «Схема БД» должно стать Таблицы (6) — пять твоих и служебная sqlite_sequence.

Осталось два дела

1. Внешние ключи. Правой кнопкой по таблице → Modify Table... → вкладка Foreign Keys → Add:

Таблица Column Table Column
students group_id groups group_id
grades student_id students student_id
grades subject_id subjects subject_id
grades teacher_id teachers teacher_id

2. Проверка. Выполни в Execute SQL:

PRAGMA foreign_key_check;

Должно вернуть пусто.

Как закончишь с ключами, скажи — подскажу, как занести данные и сделать итоговый запрос для сдачи.

А
Аноним

Как проверить внешний ключ правой кнопки по таблице Modify Table если нет

Нейросеть22 часа назад

На фото два разных момента, разберу по порядку.

1. Почему «нет» вкладки Foreign Keys

Ты работаешь в DB Browser for SQLite, а я раньше описывал окно из SQLiteStudio. В DB Browser в диалоге «Модифицировать таблицу» вкладки Foreign Keys действительно нет — внешние ключи там через графику не добавляются. Их прописывают прямо в CREATE TABLE, то есть через Execute SQL.

2. Ошибка в имени таблицы

В списке стоит grades BETWEEN — в имя таблицы попало выражение проверки. Таблицы grades у тебя нет. Поэтому её надо пересоздать.

3. Сначала проверь, есть ли ключи

Вкладка Execute SQL, вставь и нажми F5:

PRAGMA foreign_key_list('students');
PRAGMA foreign_key_list('grades');

Если оба запроса вернули пусто — внешних ключей нет, и это ожидаемо для таблиц, созданных через форму DB Browser.

4. Исправляем скриптом

Таблицы пустые, поэтому можно смело пересоздать. Вставь целиком:

PRAGMA foreign_keys = OFF;

DROP TABLE IF EXISTS "grades BETWEEN";
DROP TABLE IF EXISTS "grades";
DROP TABLE IF EXISTS "students";

CREATE TABLE "students" (
    "student_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "last_name" TEXT NOT NULL,
    "first_name" TEXT NOT NULL,
    "group_id" INTEGER NOT NULL REFERENCES "groups" ("group_id")
);

CREATE TABLE "grades" (
    "grade_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "student_id" INTEGER NOT NULL REFERENCES "students" ("student_id"),
    "subject_id" INTEGER NOT NULL REFERENCES "subjects" ("subject_id"),
    "teacher_id" INTEGER NOT NULL REFERENCES "teachers" ("teacher_id"),
    "grade" INTEGER NOT NULL CHECK ("grade" BETWEEN 2 AND 5),
    "grade_date" TEXT NOT NULL
);

PRAGMA foreign_keys = ON;

Порядок нажатий: F5 (или кнопка ▶) → затем «Записать изменения» в тулбаре (или Ctrl+S). Без второго шага таблицы останутся только в памяти.

Если в students или grades ты уже успел занести данные — скажи, тогда сделаю скрипт с переносом строк, а не с удалением.

5. Проверка после скрипта

PRAGMA foreign_key_list('students');
PRAGMA foreign_key_list('grades');

Ожидаемо: первый запрос — 1 строка (group_id → groups), второй — 3 строки (students, subjects, teachers).

PRAGMA foreign_key_check;

Должно вернуть пусто. И в «Схема БД» снова Таблицы (6): grades, groups, sqlite_sequence, students, subjects, teachers.

Ещё включи проверку для соединения: вкладка Edit Pragmas → Foreign Keys → Yes → Save. Это настройка подключения, после перезапуска программы её надо ставить снова.

Что теперь понятно про принцип

  • PRIMARY KEY — уникальный номер строки внутри своей таблицы.
  • REFERENCES — внешний ключ: значение обязано существовать в другой таблице. Здесь grades.student_id не сможет указать на несуществующего студента.
  • CHECK — ограничение на значение: grade BETWEEN 2 AND 5 не пропустит 1 или 6.
  • Внешние ключи прописываются при создании таблицы; через ALTER TABLE в SQLite их добавить нельзя, поэтому таблицу пересоздают. Именно поэтому здесь это безопасно: данных ещё нет.

Как выполнишь — пришли фото списка таблиц или результат PRAGMA foreign_key_list('grades');, проверю. Дальше останется занести данные и собрать итоговый запрос для сдачи.

А
Аноним

Как исправить таблицу имени таблицу grades оставить только

Нейросеть21 час назад

Таблицу с кривым именем проще удалить и создать заново — данных в ней нет. Переименовать тоже можно (ALTER TABLE "grades BETWEEN" RENAME TO "grades";), но у неё всё равно нет внешних ключей и CHECK, а в SQLite через ALTER TABLE их не добавить. Значит, пересоздавать придётся в любом случае — совместим оба шага.

1. Проверь, что там пусто

Execute SQL → вставь → F5:

SELECT COUNT(*) FROM "grades BETWEEN";

Если вернулось 0 — смело продолжай. Если числа есть — скажи, сделаю скрипт с переносом строк, чтобы данные не потерялись.

2. Удали кривую и создай нормальную

Тот же Execute SQL:

DROP TABLE IF EXISTS "grades BETWEEN";

CREATE TABLE "grades" (
    "grade_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "student_id" INTEGER NOT NULL REFERENCES "students" ("student_id"),
    "subject_id" INTEGER NOT NULL REFERENCES "subjects" ("subject_id"),
    "teacher_id" INTEGER NOT NULL REFERENCES "teachers" ("teacher_id"),
    "grade" INTEGER NOT NULL CHECK ("grade" BETWEEN 2 AND 5),
    "grade_date" TEXT NOT NULL
);

Нажми F5, затем обязательно «Записать изменения» в тулбаре (или Ctrl+S) — без этого таблица останется только в памяти.

3. Проверь результат

PRAGMA foreign_key_list('grades');

Должно вернуть 3 строки: student_id → students, subject_id → subjects, teacher_id → teachers.

PRAGMA foreign_key_check;

Должно вернуть пусто.

В «Схема БД» вкладки «Данные» имя станет просто grades, а в списке будет 6 таблиц: grades, groups, sqlite_sequence, students, subjects, teachers.

Почему так вышло

Название таблицы берётся из поля «Имя таблицы» первой вкладки, а не из вкладки с проверками. Скорее всего, grades BETWEEN 2 AND 5 попало именно в поле имени. Отсюда ошибка near "BETWEEN": syntax error — SQLite увидела пробел и решила, что дальше идёт команда, а не имя. Поэтому в имени таблицы — только латиница и подчёркивания, а CHECK пишется в отдельной вкладке.

Ещё момент: у students внешний ключ тоже, скорее всего, не прописан. Проверь:

PRAGMA foreign_key_list('students');

Если пусто — пересоздай так же (только если таблица без данных):

DROP TABLE IF EXISTS "students";

CREATE TABLE "students" (
    "student_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "last_name" TEXT NOT NULL,
    "first_name" TEXT NOT NULL,
    "group_id" INTEGER NOT NULL REFERENCES "groups" ("group_id")
);

Как закончишь — пришли фото списка таблиц или вывод PRAGMA foreign_key_list('grades');. Дальше останется занести данные и собрать итоговый запрос для сдачи.

А
Аноним

Куда щас надо зайти

Нейросеть21 час назад

Во вкладку «Выполнить SQL» (Execute SQL) — она в верхней строке вкладок, правая из четырёх: «Структура БД» · «Данные» · «Изменить прагмы» · «Выполнить SQL».

Что делать по шагам

  1. Открой вкладку «Выполнить SQL».
  2. В большом верхнем поле — там, где уже висит текст SELECT * FROM grades BETWEEN..., — сотри всё и вставь:
DROP TABLE IF EXISTS "grades BETWEEN";

CREATE TABLE "grades" (
    "grade_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "student_id" INTEGER NOT NULL REFERENCES "students" ("student_id"),
    "subject_id" INTEGER NOT NULL REFERENCES "subjects" ("subject_id"),
    "teacher_id" INTEGER NOT NULL REFERENCES "teachers" ("teacher_id"),
    "grade" INTEGER NOT NULL CHECK ("grade" BETWEEN 2 AND 5),
    "grade_date" TEXT NOT NULL
);
  1. Нажми F5 или кнопку ▶ («Выполнить» слева от поля). Внизу, в панели «Сообщения», должно быть пусто, без красных ошибок.
  2. Нажми «Записать изменения» в тулбаре или Ctrl+S. Без этого скрипт не применится к файлу базы.
  3. Перейди во вкладку «Структура БД» и нажми «Обновить» (F5). В списке должно быть 6 таблиц, и среди них — нормальная grades, без BETWEEN.

Проверка

Вернись в «Выполнить SQL» и выполни:

PRAGMA foreign_key_list('grades');

Должно появиться 3 строки с students, subjects, teachers. Если появились — внешние ключи на месте.

Если программа выдаст ошибку no such table: students — значит, students ещё не создана или названа иначе. Пришли фото списка таблиц, разберёмся.

А
Аноним

Тут пусто

Нейросеть21 час назад

Ты зашёл правильно — это вкладка «Выполнить SQL». Но в большом белом поле сейчас пусто, поэтому программа и написала «Execution finished without errors» — она выполнила пустой запрос. Нужно вставить туда команды.

1. Вставь скрипт в белое поле

Кликни в белое поле под панелью с вкладками SQL 2 … SQL 9, затем нажми Ctrl+V. Если не вставляется — правой кнопкой мыши → Вставить.

DROP TABLE IF EXISTS "grades BETWEEN";

CREATE TABLE "grades" (
    "grade_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "student_id" INTEGER NOT NULL REFERENCES "students" ("student_id"),
    "subject_id" INTEGER NOT NULL REFERENCES "subjects" ("subject_id"),
    "teacher_id" INTEGER NOT NULL REFERENCES "teachers" ("teacher_id"),
    "grade" INTEGER NOT NULL CHECK ("grade" BETWEEN 2 AND 5),
    "grade_date" TEXT NOT NULL
);

Если в старой таблице grades BETWEEN уже есть строки, не удаляй её — сначала напиши мне, сделаем перенос данных.

2. Выполни

Нажми F5 (или кнопку ▶ на панели). Внизу должно снова появиться «Execution finished without errors», но уже без красных ошибок.

Затем нажми «Записать изменения» на верхней панели — без этого таблица останется только в памяти.

3. Проверь

В том же поле выполни:

PRAGMA foreign_key_list('grades');

Должно появиться 3 строки: students, subjects, teachers.

Потом открой вкладку «Структура БД» и нажми F5 для обновления. В списке должна быть таблица grades без BETWEEN, всего 6 таблиц.

Пришли фото, если после F5 появятся ошибки или PRAGMA вернёт пусто.

А
Аноним

Что дальше

Нейросеть21 час назад

Ты в правильной вкладке, но в поле остался случайный текст CREATE TABLE sqlite_sequence(name,seq). Эту команду выполнять нельзя — sqlite_sequence создаётся автоматически. Если её выполнить, будет ошибка.

Что делать прямо сейчас

  1. Кликни в поле SQL 9.
  2. Нажми Ctrl+A, затем Delete — поле должно стать полностью пустым.
  3. Вставь туда скрипт:
DROP TABLE IF EXISTS "grades BETWEEN";
DROP TABLE IF EXISTS "grades";

CREATE TABLE "grades" (
    "grade_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "student_id" INTEGER NOT NULL REFERENCES "students" ("student_id"),
    "subject_id" INTEGER NOT NULL REFERENCES "subjects" ("subject_id"),
    "teacher_id" INTEGER NOT NULL REFERENCES "teachers" ("teacher_id"),
    "grade" INTEGER NOT NULL CHECK ("grade" BETWEEN 2 AND 5),
    "grade_date" TEXT NOT NULL
);
  1. Нажми F5 (или ▶). Внизу должно снова появиться «Execution finished without errors».
  2. Нажми «Записать изменения» на верхней панели (или Ctrl+S). Без этого таблица не сохранится в файл.
  3. Нажми F5 ещё раз в панели «Схема БД» — список обновится.

Что должно получиться

В «Схема БД» будет 6 таблиц:

  • grades — нормальное имя, без BETWEEN;
  • groups;
  • sqlite_sequence — служебная;
  • students;
  • subjects;
  • teachers.

Таблицы grades BETWEEN больше быть не должно.

Проверка внешних ключей

В поле SQL выполни:

PRAGMA foreign_key_list('grades');

Должно появиться 3 строки: students, subjects, teachers. Если строки есть — ключи на месте.

Если появится ошибка no such table: students — значит, таблица students называется иначе или не создана. Пришли фото списка таблиц, разберёмся.

После этого останется пересоздать students с внешним ключом на groups (если он там ещё не прописан) и занести данные. Скажи, когда grades появится в списке, — подскажу следующий шаг.

А
Аноним

Что делать если не нажимается на SQL9*

А
Аноним

Что делать если не нажимается на SQL9*

Нейросеть21 час назад

Вкладка SQL 9 у тебя уже открыта — на фото она подсвечена. Не нужно по ней кликать ещё раз. Нужно кликнуть внутрь белого поля, где сейчас пусто, и просто начать печатать.

Если курсор не появляется

  1. Кликни в центр белого поля под вкладками — должна появиться мигающая вертикальная черта.
  2. Если не появляется, закрой лишние вкладки: на каждой вкладке есть крестик x. Оставь одну, например SQL 9.
  3. Попробуй нажать Ctrl+A, затем начни печатать. Если печатается — всё в порядке.

Вставь этот код в поле

Скопируй и вставь (Ctrl+V или правой кнопкой → «Вставить»):

DROP TABLE IF EXISTS "grades BETWEEN";

CREATE TABLE "grades" (
    "grade_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "student_id" INTEGER NOT NULL REFERENCES "students" ("student_id"),
    "subject_id" INTEGER NOT NULL REFERENCES "subjects" ("subject_id"),
    "teacher_id" INTEGER NOT NULL REFERENCES "teachers" ("teacher_id"),
    "grade" INTEGER NOT NULL CHECK ("grade" BETWEEN 2 AND 5),
    "grade_date" TEXT NOT NULL
);

Если Ctrl+V не срабатывает, набери вручную первую строку DROP TABLE IF EXISTS "grades BETWEEN"; — этого уже достаточно, чтобы проверить, что поле работает.

Выполни

  1. Нажми F5 или кнопку ▶ на панели.
  2. Внизу должно появиться Execution finished without errors.
  3. Нажми «Записать изменения» на верхней панели (или Ctrl+S).
  4. В правой панели «Схема БД» нажми F5, чтобы обновить список.

Что должно измениться

Сейчас на фото справа в «Схема БД» есть grades BETWEEN. После скрипта она исчезнет, а вместо неё появится нормальная grades. Всего будет 6 таблиц:

  • grades — новая;
  • groups;
  • sqlite_sequence;
  • students;
  • subjects;
  • teachers.

Если после F5 появится красная ошибка — пришли фото с текстом ошибки, разберёмся.

Нейросеть21 час назад

Вкладку SQL 9 нажимать не нужно — она уже открыта и активна. Именно поэтому клик по её заголовку ничего не меняет: она и так выбрана (вкладка светлая, в белом поле мигает курсор и стоит номер строки 1).

Куда нажимать

Кликни не по заголовку вкладки, а внутрь белого поля, на строку 1 — там, где стоит текстовый курсор. После этого поле примет текст.

Дальше:

  1. Ctrl+A, затем Delete — на всякий случай очистить.
  2. Ctrl+V — вставить скрипт (или правой кнопкой → «Вставить»).
  3. F5 — выполнить.
  4. «Записать изменения» на верхней панели (или Ctrl+S).

Скрипт

DROP TABLE IF EXISTS "grades BETWEEN";
DROP TABLE IF EXISTS "grades";

CREATE TABLE "grades" (
    "grade_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "student_id" INTEGER NOT NULL REFERENCES "students" ("student_id"),
    "subject_id" INTEGER NOT NULL REFERENCES "subjects" ("subject_id"),
    "teacher_id" INTEGER NOT NULL REFERENCES "teachers" ("teacher_id"),
    "grade" INTEGER NOT NULL CHECK ("grade" BETWEEN 2 AND 5),
    "grade_date" TEXT NOT NULL
);

В панели «Схема БД» видно, что grades BETWEEN ещё на месте — значит, скрипт пока ни разу не выполнялся, поле было пустым.

Если вкладка действительно не реагирует

  • Переключись на соседнюю, например SQL 8 — все вкладки одинаковые, это просто блокноты для запросов.
  • Или нажми «+» слева от вкладок — откроется новая пустая вкладка.
  • Если не вставляется текст — попробуй печатать вручную или правой кнопкой → «Вставить».

Важно: не нажимай красный крестик в правом краю панели вкладок и «Закрыть базу данных» на верхней панели — после этого придётся заново открывать практическая.db. Закрывать вкладку не нужно, пусть висят.

Панель справа «Редактирование ячейки БД» — от вкладки «Данные», она не мешает, просто игнорируй.

Проверка

После F5 и сохранения выполни:

PRAGMA foreign_key_list('grades');

Должно быть 3 строки: students, subjects, teachers.

Затем нажми F5 в панели «Схема БД». Список должен стать: grades, groups, sqlite_sequence, students, subjects, teachers — без grades BETWEEN.

Напиши, что покажет PRAGMA foreign_key_list('grades');. Дальше проверим, есть ли связь у students, и перейдём к данным.

А
Аноним

Нажимаю на Ctrl+v высвечивается это

А
Аноним

Нажимаю на Ctrl+v высвечивается это

Нейросеть21 час назад

Ты вставил не мой скрипт, а текст CREATE TABLE sqlite_sequence(name,seq) — это чужой текст из буфера обмена (похоже, он попал туда, когда ты кликал по sqlite_sequence в «Схема БД» — там показывается её CREATE-команда). Поэтому в поле оказалось это, а таблица grades BETWEEN на месте.

sqlite_sequence создавать нельзя — она служебная и уже есть.

Что сделать

  1. Кликни в белое поле SQL 9, где стоит CREATE TABLE sqlite_sequence(name,seq).
  2. Ctrl+A, затем Delete — поле должно стать полностью пустым.
  3. Теперь вставь мой скрипт. Если Ctrl+V опять вставит sqlite_sequence, значит в буфере старое — скопируй текст ещё раз, выделив его мышкой прямо в этом сообщении, и только потом вставляй.
DROP TABLE IF EXISTS "grades BETWEEN";

CREATE TABLE "grades" (
    "grade_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "student_id" INTEGER NOT NULL REFERENCES "students" ("student_id"),
    "subject_id" INTEGER NOT NULL REFERENCES "subjects" ("subject_id"),
    "teacher_id" INTEGER NOT NULL REFERENCES "teachers" ("teacher_id"),
    "grade" INTEGER NOT NULL CHECK ("grade" BETWEEN 2 AND 5),
    "grade_date" TEXT NOT NULL
);
  1. F5 — внизу должно быть Execution finished without errors.
  2. «Записать изменения» на верхней панели (или Ctrl+S).
  3. F5 в панели «Схема БД».

Если вставка не работает — набери вручную

Достаточно двух строк, остальное можно не печатать:

DROP TABLE IF EXISTS "grades BETWEEN";

Выполни это (F5 + «Записать изменения»). Кривая таблица исчезнет, и grades можно будет создать заново через обычное окно «Создать таблицу», как ты делал для остальных.

Проверка

После выполнения в «Схема БД» должно быть 6 таблиц: grades, groups, sqlite_sequence, students, subjects, teachers. grades BETWEEN пропадёт.

Потом выполни:

PRAGMA foreign_key_list('grades');

Должно быть 3 строки. Пришли результат — проверим связи и перейдём к данным.

Нейросеть21 час назад

Текст CREATE TABLE sqlite_sequence(name,seq); — это то, что уже лежало в буфере обмена с прошлого раза. При Ctrl+V вставляется именно буфер, а мой скрипт туда ещё не попал. Плюс в поле стоит чужой текст, и его нужно сначала стереть.

sqlite_sequence — служебная таблица, её создаёт сам SQLite. Выполнять эту команду нельзя: появится ошибка «table sqlite_sequence already exists».

Порядок действий

1. Выдели скрипт в чате. Наведи мышь на первую строку кода, зажми левую кнопку и протяни до последней строки (или сделай тройной клик по блоку кода ниже). Скопируй: Ctrl+C.

DROP TABLE IF EXISTS "grades BETWEEN";
DROP TABLE IF EXISTS "grades";

CREATE TABLE "grades" (
    "grade_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "student_id" INTEGER NOT NULL REFERENCES "students" ("student_id"),
    "subject_id" INTEGER NOT NULL REFERENCES "subjects" ("subject_id"),
    "teacher_id" INTEGER NOT NULL REFERENCES "teachers" ("teacher_id"),
    "grade" INTEGER NOT NULL CHECK ("grade" BETWEEN 2 AND 5),
    "grade_date" TEXT NOT NULL
);

2. Вернись в DB Browser, кликни в белое поле SQL 9.

3. Очисти поле: Ctrl+A, потом Delete. Поле должно стать пустым — ни CREATE TABLE, ничего.

4. Вставь: Ctrl+V. Теперь должна появиться команда DROP TABLE IF EXISTS "grades BETWEEN";, а не sqlite_sequence.

5. Выполни: F5. Внизу — Execution finished without errors.

6. Сохрани: кнопка «Записать изменения» на верхней панели.

7. Обнови схему: щёлкни по панели «Схема БД» и нажми F5.

Как понять, что получилось

Сейчас в «Схема БД» стоит grades BETWEEN — значит, скрипт ни разу не выполнялся, таблица на месте. После правильного выполнения вместо неё появится grades, и в списке будет 6 строк: grades, groups, sqlite_sequence, students, subjects, teachers.

Если Ctrl+V снова вставит старое

Буфер не обновился. Тогда:

  • скопируй текст ещё раз, убедившись, что выделен именно код, а не пустое место;
  • или набери вручную первые две строки, этого хватит, чтобы проверить работу поля.

Напиши, что появится после F5, — по «Сообщениям» внизу сразу видно, прошло или нет.