Где в SQL запросе ошибка?
Всех приветствую! Подскажите по проблеме:
Начал изучать 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
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Чтобы найти ошибку в SQL запросе, нужно внимательно проанализировать его и определить, в каком месте возникает проблема. Вот несколько общих моментов, на которые стоит обратить внимание:
1. Проверьте синтаксис SQL запроса. Убедитесь, что все ключевые слова, операторы и имена таблиц/столбцов написаны правильно. Ошибки в синтаксисе могут привести к некорректной работе запроса.
2. Проверьте правильность использования кавычек. Если вы используете строки в запросе, убедитесь, что они заключены в правильные типы кавычек (одинарные или двойные) и что они не нарушают структуру запроса.
3. Проверьте типы данных. Убедитесь, что сравниваемые значения имеют совместимые типы данных. Например, сравнение числа со строкой может привести к ошибке.
4. Проверьте правильность использования операторов. Убедитесь, что вы используете правильный оператор для вашего намерения (например, использование оператора "=" вместо "LIKE" для сравнения строк).
5. Проверьте наличие необходимых разрешений. Убедитесь, что пользователь, выполняющий запрос, имеет необходимые разрешения для выполнения операций, описанных в запросе.
Пример:
SELECT * FROM users WHERE name = 'John'
Если в данном запросе ошибка, то, возможно, она заключается в том, что таблица "users" не существует или в ней отсутствует столбец "name". Также возможно, что имя "John" должно быть заключено в кавычки или в запросе отсутствует условие для фильтрации данных.
Путем внимательного анализа каждой части SQL запроса и проверки на указанные выше моменты можно найти и исправить ошибку. Не забывайте также использовать инструменты для отладки SQL запросов, чтобы легче обнаруживать и исправлять проблемы.