Вопрос или проблема
Вот мой SQL-скрипт:
-- Создание базы данных в памяти для проекта аренды инструментов.
-- Ожидается, что это будет заменено на фактическую базу данных
--
-- Создание схемы для использования
CREATE SCHEMA IF NOT EXISTS Tools_R_Us_Schema;
USE Tools_R_Us_Schema;
-- Создание таблицы типов инструментов для списка типов инструментов
CREATE TABLE IF NOT EXISTS Tool_Type (
type varchar(20) NOT NULL PRIMARY KEY
);
-- Создание таблицы брендов поставщиков для списка брендов
CREATE TABLE IF NOT EXISTS Vendors (
brand varchar(30) NOT NULL PRIMARY KEY
);
-- Создание таблицы инструментов для списка инструментов
CREATE TABLE IF NOT EXISTS Tools (
code varchar(10) NOT NULL PRIMARY KEY,
type varchar(20) NOT NULL REFERENCES Tool_Type(type),
brand varchar(30) NOT NULL REFERENCES Vendors(brand)
);
-- Создание таблицы тарифов на инструменты в зависимости от типа инструмента
CREATE TABLE IF NOT EXISTS Tools_Charges (
id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
type varchar(20) NOT NULL REFERENCES Tool_Type(type),
daily_charge decimal(5,2),
weekday_charge bit,
weekend_charge bit,
holiday_charge bit
);
-- Создание таблицы с днями недели, когда может выпасть праздник
CREATE TABLE IF NOT EXISTS Holiday_Days_Of_Week (
day_of_the_week varchar(15) NOT NULL PRIMARY KEY
);
-- Создание таблицы с допустимыми частотами праздников
CREATE TABLE IF NOT EXISTS Holiday_Frequency (
frequency varchar(20) NOT NULL PRIMARY KEY
);
-- Создание таблицы праздников для проверки, является ли это праздником
CREATE TABLE IF NOT EXISTS Holidays (
name varchar(20) NOT NULL PRIMARY KEY,
holiday_month int,
holiday_day int,
day_of_the_week varchar(15) REFERENCES Holiday_Days_Of_Week(day_of_the_week),
frequency varchar(20) REFERENCES Holiday_Frequency(frequency)
);
-- Создание списка допустимых статусов для аренды
CREATE TABLE IF NOT EXISTS Tool_Status (
status varchar(10) NOT NULL PRIMARY KEY
);
-- Создание таблицы аренды для отслеживания, когда инструмент был арендован
CREATE TABLE IF NOT EXISTS Tool_Rentals (
id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
code varchar(10) NOT NULL REFERENCES Tools(code),
type varchar(20) NOT NULL REFERENCES Tool_Type(type),
brand varchar(30) NOT NULL REFERENCES Vendors(brand),
rental_days int NOT NULL,
checkout_date date NOT NULL,
due_date date,
charge_days int NOT NULL,
due decimal(10,2) NOT NULL,
daily_charge decimal(5,2) NOT NULL,
pre_discount_charge decimal(10,2) NOT NULL,
discount_percent decimal(3,3),
discount_amount decimal(10,2),
final_charge decimal(10,2) NOT NULL,
status varchar(10) NOT NULL REFERENCES Tool_Status(status)
);
-- Заполнение типов инструментов
INSERT INTO Tool_Type (type)
VALUES ('ChainSaw'),
('JackHammer'),
('Ladder');
-- Заполнение таблицы брендов поставщиков
INSERT INTO Vendors (brand)
VALUES ('Stihl'),
('Werner'),
('DeWalt'),
('Ridgid');
-- Заполнение таблицы инструментов
INSERT INTO Tools (code, type, brand)
VALUES ('CHNS', 'ChainSaw', 'Stihl'),
('LADW', 'Ladder', 'Werner'),
('JAKD', 'JackHammer', 'DeWalt'),
('JAKR', 'JackHammer', 'Ridgid');
-- Заполнение таблицы тарифов
INSERT INTO Tools_Charges (type, daily_charge, weekday_charge, weekend_charge, holiday_charge)
VALUES ('Ladder', 1.99, 1, 1, 0),
('ChainSaw', 1.49, 1, 0, 1),
('JackHammer', 2.99, 1, 0, 0);
-- Заполнение дней недели, когда может выпасть праздник
INSERT INTO Holiday_Days_Of_Week (day_of_the_week)
VALUES ('Monday');
-- Заполнение частот для допустимых праздников
INSERT INTO Holiday_Frequency (frequency)
VALUES ('First');
-- Заполнение таблицы праздников
INSERT INTO Holidays (name, holiday_month, holiday_day, day_of_the_week, frequency)
VALUES ('День независимости', 7, 4, null, null),
('День труда', null, null, 'Monday', 'First');
-- Заполнение допустимых статусов для аренды
INSERT INTO Tool_Status (status)
VALUES ('ACTIVE'),
('CLOSED');
Вот ошибка:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Столбец "TYPE" не найден; SQL-операция:
Затем трассировка содержит:
org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Не удалось выполнить SQL-операцию скрипта #14 из файла [/Users/paqpaq/Dropbox/WORK/CF/pa1024/build/resources/main/data.sql]: INSERT INTO Tools (code, type, brand) VALUES ('CHNS', 'ChainSaw', 'Stihl'), ('LADW', 'Ladder', 'Werner'), ('JAKD', 'JackHammer', 'DeWalt'), ('JAKR', 'JackHammer', 'Ridgid')
У меня возникает ошибка при вставке в Tools или Tools_Charges, которую не удается найти столбец “type”. Я пробовал изменить имя, но это не решает проблему. Я проверял это через валидатор SQL, и оно прошло валидацию. Поэтому я не знаю, в чем проблема.
На всякий случай, если это имеет значение, это в Intellij, настроенном для базы данных H2. И это работало, а затем перестало, и единственное, что я изменил, это в Tool_Type я добавил нижнее подчеркивание, потому что это странно добавляло его в консоли H2.
Мысли?
Ответ или решение
Исправление ошибки SQL: Неправильный доступ к колонке "type"
Ваша проблема с выполнением SQL-запроса заключается в сообщении об ошибке: Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TYPE" not found
. Это указывает на то, что H2 база данных не может распознать колонку с именем "type" в таблице Tools
. Рассмотрим возможные причины этой ошибки и пути ее устранения.
1. Проверьте правильность структуры таблиц
Ваши определение таблиц кажется корректным на первый взгляд, но есть несколько аспектов, которые стоит проверить:
- Убедитесь, что таблица
Tools
была создана до момента выполнения командыINSERT
. Если таблица не была создана, H2 не сможет найти нужные колонки.
2. Чувствительность к регистру
H2 Database по умолчанию не различает регистр для имен таблиц и колонок. Однако в некоторых конфигурациях или при использовании кавычек к первой букве имен может происходить различие в регистре. Убедитесь, что вы обращаетесь к колонке именно так, как она была создана. Попробуйте заключить имена колонок в двойные кавычки:
INSERT INTO Tools ("code", "type", "brand")
VALUES ('CHNS', 'ChainSaw', 'Stihl'),
('LADW', 'Ladder', 'Werner'),
('JAKD', 'JackHammer', 'DeWalt'),
('JAKR', 'JackHammer', 'Ridgid');
3. Обновление и применение изменений схемы
Если вы вносили изменения в структуру базы данных, например, изменяли имя или тип колонки, но при этом не выполняли перезагрузку или инициализацию базы данных, это может привести к несоответствию. В случае использования H2, убедитесь, что ваша база данных была перезапущена либо сброшены все существующие данные перед повторным запуском скрипта.
4. Проверьте конфигурации H2
Проблемы также могут возникнуть из-за специфики конфигурации H2. Убедитесь, что у вас установлены последние обновления H2, и рассмотрите возможность изменения режимов работы, если используете режим совместимости с другими базами данных.
5. Анализ ошибок в IntelliJ
Так как вы работаете в IntelliJ, важно проверить логи на наличие других ошибок, которые могли возникнуть до вашей команды INSERT
. Ошибки на предыдущих строках могут повлиять на выполнение последующих запросов.
Заключение
После проверки всех вышеперечисленных аспектов попробуйте снова выполнить ваш скрипт. Если проблема сохраняется, может иметь смысл создать новую тестовую базу данных с чистым исполнением вашего скрипта, чтобы понять, в чем именно заключалась проблема.
Если у вас есть доступ к другим инструментам для работы с SQL, протестируйте свои запросы вне IntelliJ, чтобы исключить любые специфические для среды факторы.