Ошибка SQL или отсутствующая база данных (рядом с «,» синтаксическая ошибка)

#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. Это хорошо. Если ответ вам помог, пожалуйста, отметьте его как ответ.