Где в SQL запросе ошибка?

Ссылка скопирована
1 ответ

Всех приветствую! Подскажите по проблеме:
Начал изучать SQL по книге, в самом начале пример создания таблиц:

CREATE TABLE Departmets( ID_Dep INT IDENTITY PRIMARY KEY, DepShortName CHAR(4) NOT NULL UNIQUE, DepName VARCHAR(128) NOT NULL UNIQUE, DepAdress VARCHAR(128) NOT NULL DEFAULT «NoAdress»); CREATE TABLE Groups( ID_Group IDENTITY PRIMARY KEY, GroupName CHAR(8) NOT NULL UNIQUE, Year BYTE NOT NULL DEFAULT 1 CONSTRAINT LearningYears CHECK(BETWEEN 1 AND 6), Department INT FOREIGN KEY REFERENCES Departmets(ID_Dep) ON DELETE NO ACTION ON UPDATE CASCADE), Monitor INT NOT NULL FOREIGN KEY REFERENCES Students(ID_Stud) ON DELETE SET NULL ON UPDATE CASCADE); CREATE TABLE Students( ID_Stud IDENTITY PRIMARY KEY, StudName VARCHAR(32) NOT NULL DEFAULT «InvisibleStudient», StudAdress VARCHAR(128) NOT NULL DEFAULT «HomelessStudient»); Rating BYTE NOT NULL DEFAULT 0 CONSTRAINT PersonalRatings CHECK(BETWEEN 0 AND 100), Scholarship INT NOT NULL DEFAULT 0, Bonus INT NOT NULL DEFAULT 0, Group INT NOT NULL FOREIGN KEY REFERENCES Groups(ID_Group) ON DELETE NO ACTION ON UPDATE CASCADE); ALTER TABLE Students ADD CONSTRAINT MonitorBonus CHECK ( IF Students.ID_Stud IN (SELECT Groups.Monitor FROM Groups) Then Students.Bonus = 0.01 * Students.Scholarship * Students.Rating);

CREATE TABLE Departmets( ID_Dep INT IDENTITY PRIMARY KEY, DepShortName CHAR(4) NOT NULL UNIQUE, DepName VARCHAR(128) NOT NULL UNIQUE, DepAdress VARCHAR(128) NOT NULL DEFAULT «NoAdress»); CREATE TABLE Groups( ID_Group IDENTITY PRIMARY KEY, GroupName CHAR(8) NOT NULL UNIQUE, Year BYTE NOT NULL DEFAULT 1 CONSTRAINT LearningYears CHECK(BETWEEN 1 AND 6), Department INT FOREIGN KEY REFERENCES Departmets(ID_Dep) ON DELETE NO ACTION ON UPDATE CASCADE), Monitor INT NOT NULL FOREIGN KEY REFERENCES Students(ID_Stud) ON DELETE SET NULL ON UPDATE CASCADE); CREATE TABLE Students( ID_Stud IDENTITY PRIMARY KEY, StudName VARCHAR(32) NOT NULL DEFAULT «InvisibleStudient», StudAdress VARCHAR(128) NOT NULL DEFAULT «HomelessStudient»); Rating BYTE NOT NULL DEFAULT 0 CONSTRAINT PersonalRatings CHECK(BETWEEN 0 AND 100), Scholarship INT NOT NULL DEFAULT 0, Bonus INT NOT NULL DEFAULT 0, Group INT NOT NULL FOREIGN KEY REFERENCES Groups(ID_Group) ON DELETE NO ACTION ON UPDATE CASCADE); ALTER TABLE Students ADD CONSTRAINT MonitorBonus CHECK ( IF Students.ID_Stud IN (SELECT Groups.Monitor FROM Groups) Then Students.Bonus = 0.01 * Students.Scholarship * Students.Rating);

Образец запроса приведен в итоговом виде, без каких либо предварительных предшествующих действий, т.е. предложено сразу скопировать этот запрос и выполнить его на какой БД.
Выполняю запрос с помощью sqlite3, создал пустую чистую базу данных test.db
Пробовал как в sqlite3 так и в гуевом DB Browser for SQLite Version 3.12.2 выполнять этот запрос результат один:
Таблица Departmets создается без проблем, дальше на этапе создания таблицы Groups на строчке
CONSTRAINT LearningYears CHECK(BETWEEN 1 AND 6),
Выскакивает ошибка:

Execution finished with errors. Result: near "BETWEEN": syntax error At line 1: CREATE TABLE Groups( ID_Group IDENTITY PRIMARY KEY, GroupName CHAR(8) NOT NULL UNIQUE, Year BYTE NOT NULL DEFAULT 1 CONSTRAINT LearningYears CHECK (BETWEEN

Execution finished with errors. Result: near "BETWEEN": syntax error At line 1: CREATE TABLE Groups( ID_Group IDENTITY PRIMARY KEY, GroupName CHAR(8) NOT NULL UNIQUE, Year BYTE NOT NULL DEFAULT 1 CONSTRAINT LearningYears CHECK (BETWEEN

В чем ошибка то не пойму? У авторов ошибки надо понимать небыло, но в какой SQL СУБД они работали и выполняли свои запросы не сказано

Дополнительно:

Или опечатка, или ошибка. (BETWEEN 1 AND 6) совершенно очевидно не является корректным выражением.

И вообще очень странно, что сервер не матюгнулся раньше - на то место, где применены кривые кавычки.

Ответы:

Ошибка тут:

Result: near "BETWEEN": syntax error

Разные СУБД имеют свои особенности/ограничения. В SQLite использованный синтаксис, очевидно, не поддерживается.
https://database.guide/create-a-check-constraint-i...
https://www.sqlitetutorial.net/sqlite-between/
Меняйте СУБД или книгу.

  • Ошибка тут:

    Result: near "BETWEEN": syntax erro

    Ошибка не там, если чуть переделать, заменить
    CONSTRAINT LearningYears CHECK(BETWEEN 1 AND 6),
    на

    CONSTRAINT LearningYears CHECK(LearningYears >= 1 AND LearningYears <=6),

    CONSTRAINT LearningYears CHECK(LearningYears >= 1 AND LearningYears <=6),

    То выполнение запроса показывает ошибку уже на следующем месте:

    Execution finished with errors. Result: near "FOREIGN": syntax error At line 1: CREATE TABLE Groups( ID_Group IDENTITY PRIMARY KEY, GroupName CHAR(8) NOT NULL UNIQUE, Year BYTE NOT NULL DEFAULT 1 CONSTRAINT LearningYears CHECK(LearningYears >= 1 AND LearningYears <=6), Department INT FOREIGN

    Execution finished with errors. Result: near "FOREIGN": syntax error At line 1: CREATE TABLE Groups( ID_Group IDENTITY PRIMARY KEY, GroupName CHAR(8) NOT NULL UNIQUE, Year BYTE NOT NULL DEFAULT 1 CONSTRAINT LearningYears CHECK(LearningYears >= 1 AND LearningYears <=6), Department INT FOREIGN

    То же самое если и вообще убрать эту строчку CONSTRAINT LearningYears CHECK(BETWEEN 1 AND 6), и выполнить без неё:

    CREATE TABLE Groups( ID_Group IDENTITY PRIMARY KEY, GroupName CHAR(8) NOT NULL UNIQUE, Year BYTE NOT NULL DEFAULT 1, Department INT FOREIGN KEY REFERENCES Departmets(ID_Dep) ON DELETE NO ACTION ON UPDATE CASCADE), Monitor INT NOT NULL FOREIGN KEY REFERENCES Students(ID_Stud) ON DELETE SET NULL ON UPDATE CASCADE);

    CREATE TABLE Groups( ID_Group IDENTITY PRIMARY KEY, GroupName CHAR(8) NOT NULL UNIQUE, Year BYTE NOT NULL DEFAULT 1, Department INT FOREIGN KEY REFERENCES Departmets(ID_Dep) ON DELETE NO ACTION ON UPDATE CASCADE), Monitor INT NOT NULL FOREIGN KEY REFERENCES Students(ID_Stud) ON DELETE SET NULL ON UPDATE CASCADE);

    Выдаёт:

    Execution finished with errors. Result: near "FOREIGN": syntax error At line 1: CREATE TABLE Groups( ID_Group IDENTITY PRIMARY KEY, GroupName CHAR(8) NOT NULL UNIQUE, Year BYTE NOT NULL DEFAULT 1, Department INT FOREIG

    Execution finished with errors. Result: near "FOREIGN": syntax error At line 1: CREATE TABLE Groups( ID_Group IDENTITY PRIMARY KEY, GroupName CHAR(8) NOT NULL UNIQUE, Year BYTE NOT NULL DEFAULT 1, Department INT FOREIG

  • Nordman99,

    Ошибка не там, если чуть переделать, заменить

    Разумеется, если исправить в этом месте, то та ошибка исчезает. Так что она там. Это не исключает наличие иных.

  • Nordman99, https://metanit.com/sql/sqlite/2.4.php
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Юрий Linux Ответ

Чтобы найти ошибку в SQL запросе, нужно внимательно проанализировать его и определить, в каком месте возникает проблема. Вот несколько общих моментов, на которые стоит обратить внимание:

1. Проверьте синтаксис SQL запроса. Убедитесь, что все ключевые слова, операторы и имена таблиц/столбцов написаны правильно. Ошибки в синтаксисе могут привести к некорректной работе запроса.

2. Проверьте правильность использования кавычек. Если вы используете строки в запросе, убедитесь, что они заключены в правильные типы кавычек (одинарные или двойные) и что они не нарушают структуру запроса.

3. Проверьте типы данных. Убедитесь, что сравниваемые значения имеют совместимые типы данных. Например, сравнение числа со строкой может привести к ошибке.

4. Проверьте правильность использования операторов. Убедитесь, что вы используете правильный оператор для вашего намерения (например, использование оператора "=" вместо "LIKE" для сравнения строк).

5. Проверьте наличие необходимых разрешений. Убедитесь, что пользователь, выполняющий запрос, имеет необходимые разрешения для выполнения операций, описанных в запросе.

Пример:

SELECT * FROM users WHERE name = 'John'

SELECT * FROM users WHERE name = 'John'

Если в данном запросе ошибка, то, возможно, она заключается в том, что таблица "users" не существует или в ней отсутствует столбец "name". Также возможно, что имя "John" должно быть заключено в кавычки или в запросе отсутствует условие для фильтрации данных.

Путем внимательного анализа каждой части SQL запроса и проверки на указанные выше моменты можно найти и исправить ошибку. Не забывайте также использовать инструменты для отладки SQL запросов, чтобы легче обнаруживать и исправлять проблемы.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно