#sqlite
#sqlite
Вопрос:
У меня есть этот запрос с синтаксической ошибкой. Не могли бы вы помочь мне найти ошибку, пожалуйста? Я провожу пару часов и не могу ее решить. Спасибо.
String sql = " INSERT INTO appointments (patient_firstname, patient_surname, fees, time, date, doctor)"
" SELECT (time, date, doctor)"
" WHERE NOT EXISTS (SELECT * FROM appointments WHERE time = ?)";
pst=conn.prepareStatement(sql);
pst.setString(1,txt_firstname.getText());
pst.setString(2,txt_surname.getText());
pst.setString(3, txt_fee.getText());
pst.setString(4, (String) cbox_time.getSelectedItem());
pst.setString(5,txt_date.getText());
pst.setString(6, (String) cbox_doctors.getSelectedItem());
pst.executeUpdate();
Комментарии:
1. Почему у вас есть круглые скобки вокруг имен столбцов в select? Select также должен возвращать то же количество столбцов, которое вы пытаетесь вставить.
2. Кроме того, в вашем заявлении есть один параметр, но вы пытаетесь связать 6?
3. О, и в этом выборе отсутствует from! Вы должны сесть за хороший учебник по SQL и изучить основы языка.
4. Что я хочу сделать, это вставить эти данные, но перед вставкой я хочу проверить время, дату, врача, чтобы избежать дублирования.
Ответ №1:
Проблемы с вашим заявлением INSERT включают в себя :-
- Похоже, вы пытаетесь вставить SELECT, где ЗНАЧЕНИЯ, которые нужно вставить, получены из предложения SELECT, но вы пытаетесь смешать это со ЗНАЧЕНИЯМИ. Эти два типа не могут быть объединены.
- Вы пытаетесь выбрать, используя столбцы в круглых скобках, и в любом случае эти три столбца НЕ БУДУТ соответствовать 6 столбцам, необходимым для вставки.
- У вас есть только 1
?
, который нужно привязать, вы пытаетесь привязать 6.
Я бы предположил, что вы могли бы упростить ситуацию, определив таблицу с УНИКАЛЬНЫМ ограничением для столбцов doctor, date и time. Затем используйте стандартную ВСТАВКУ ИЛИ ИГНОРИРОВАНИЕ с предложением VALUES .
например, рассмотрим следующую демонстрацию SQL :-
DROP TABLE IF EXISTS appointments;
CREATE TABLE IF NOT EXISTS appointments (patient_firstname TEXT, patient_surname TEXT, fees REAL, time TEXT, date TEXT, doctor INTEGER, UNIQUE (doctor, date, time));
INSERT OR IGNORE INTO appointments VALUES ('Fred','Bloggs',100.50,'10:00','2019-01-01',1);
INSERT OR IGNORE INTO appointments VALUES ('Mary','Smith',100.50,'10:00','2019-01-01',2);
INSERT OR IGNORE INTO appointments VALUES ('Sue','Bell',100.50,'10:00','2019-01-01',2);
SELECT * FROM appointments;
Это приводит к :-
т.е. назначение Сью Белл не было добавлено из-за конфликта УНИКАЛЬНЫХ ограничений, который был проигнорирован, поэтому ошибки нет.
Журнал, являющийся :-
DROP TABLE IF EXISTS appointments
> OK
> Time: 0.177s
CREATE TABLE IF NOT EXISTS appointments (patient_firstname TEXT, patient_surname TEXT, fees REAL, time TEXT, date TEXT, doctor INTEGER, UNIQUE (doctor, date, time))
> OK
> Time: 0.084s
INSERT OR IGNORE INTO appointments VALUES ('Fred','Bloggs',100.50,'10:00','2019-01-01',1)
> Affected rows: 1
> Time: 0.083s
INSERT OR IGNORE INTO appointments VALUES ('Mary','Smith',100.50,'10:00','2019-01-01',2)
> Affected rows: 1
> Time: 0.084s
INSERT OR IGNORE INTO appointments VALUES ('Sue','Bell',100.50,'10:00','2019-01-01',2)
> Affected rows: 0
> Time: 0s
SELECT * FROM appointments
> OK
> Time: 0.003s
Комментарии:
1. Спасибо. Я разобрался.
2. Это хорошо. Если ответ вам помог, пожалуйста, отметьте его как ответ.