2016-04-13 2 views
1

Я думал об использовании отдельных, но я не слишком уверен, как это сделать как один запрос для эффективности кода, есть ли способ? Я в основном пытаюсь проверить, есть ли уже существующий ввод данных, я пытаюсь проверить его с помощью режима бронирования. Спасибо :)Как добавить данные в таблицу только в том случае, если она еще не существует?

Это мой SQL-запрос:

string bookingInfo = "INSERT INTO Booking(BookingDate, BookingTime, CustomerID, EmployeeID, ServiceType, BookingLength) " + 
         "VALUES (@BookingDate, @BookingTime, @CustomerID, @EmployeeID, @ServiceType, @BookingLength) " + 
        "where not exists (SELECT 1 FROM Booking WHERE BookingTime = @BookingTime)"; 

Ошибка я получаю: «Дополнительной информацию:. Входной запрос должен содержать, по меньшей мере, одну таблицы или запрос»

+0

Что вы хотите делать, если дубликат найден? Вы ничего не хотите делать или хотите обновить запись, найденную со значениями в текущей попытке вставки? – Steve

+0

На данный момент я думаю, что если дубликат просто отображает сообщение пользователю и не добавляет дубликат в базу данных. –

+0

Но является ли TimesTime основным ключом или уникальным индексом таблицы? – Steve

ответ

1

Лучший способ - предоставить базу данных проверку.

Создать уникальный индекс или ограничение на столе:

create unique index unq_booking_bookingtime on booking(bookingtime); 

Примечание: это основано на вашем запросе. Мне кажется маловероятным, что только bookingtime определяет уникальность.

После этого база данных будет генерировать ошибку, если она встретит дубликаты. Вы можете предотвратить ошибку, используя insert ignore или insert on duplicate key update (последний является предпочтительным методом).

+0

Спасибо, мое программирование sql очень слабое, следует ли удалить, где не существует, и заменить его своей строкой кода? –

+0

@JordanCoaten. , , Да. Вы должны позволить базе данных выполнить проверку, но обратите внимание, что вы получите сообщение об ошибке. Вы можете избежать этой ошибки (большую часть времени), используя 'where'. –

0
string bookingInfo = "INSERT INTO Booking(BookingDate, BookingTime, CustomerID, EmployeeID, ServiceType, BookingLength) " + 
        "SELECT @BookingDate, @BookingTime, @CustomerID, @EmployeeID, @ServiceType, @BookingLength " + 
       " FROM Booking WHERE NOT EXISTS (SELECT * FROM Booking WHERE BookingTime = @BookingTime) LIMIT 1 " 

Попробуйте SqlFiddle

+0

Я пробовал это, но он создает цикл, который продолжает добавлять в мою базу данных. –

+0

Теперь он говорит, что есть синтаксическая ошибка, даже после того, как я добавил полу двоеточие. –

+0

Обновлен ответ с помощью примера SqlFiddle – RAnand

0

Предложение WHERE является недействительным является недействительным в "INSERT ... VALUES" заявление показано.

MySQL предоставляет форму INSERT ... SELECT ... инструкции INSERT (которая не использует предложение VALUES). Оператор SELECT может иметь предложение WHERE, но для включения предложения WHERE в SELECT должно быть предложение FROM. Вы можете использовать встроенное представление (например, производную таблицу) для возврата одной строки, или вы можете использовать встроенную таблицу DUAL в стиле Oracle DUAL для возврата одной строки. (Нам не важно, какие столбцы получить вернулся, мы просто нужно один ряд вернулся.)

Например:

INSERT INTO Booking 
(BookingDate 
, BookingTime 
, CustomerID 
, EmployeeID 
, ServiceType 
, BookingLength 
) 
SELECT @BookingDate 
    , @BookingTime 
    , @CustomerID 
    , @EmployeeID 
    , @ServiceType 
    , @BookingLength 
FROM (SELECT 1) i 
WHERE NOT EXISTS 
     (SELECT 1 
      FROM Booking b 
     WHERE b.BookingTime = @BookingTime 
    ) 

Теперь ЗЕЬЕСТ (который может быть проверен отдельно от INSERT) будет возвращать либо ноль или один ряд. И любая строка, которую он возвращает, будет передана в INSERT.

В качестве альтернативы к «НЕ СУЩЕСТВУЕТ» предикат, вы можете использовать анти-присоединиться к схеме:

SELECT @BookingDate 
    , @BookingTime 
    , @CustomerID 
    , @EmployeeID 
    , @ServiceType 
    , @BookingLength 
FROM (SELECT 1) i 
LEFT 
JOIN Booking b 
    ON b.BookingTime = @BookingTime 
WHERE b.BookingTime IS NULL 
+0

«FROM (SELECT 1) i ГДЕ НЕ СУЩЕСТВУЕТ (ВЫБРАТЬ 1 ОТ БАНКИ b WHERE b.BookingTime = @BookingTime)"; Я не слишком уверен, как добавить это в мою программу. –

+0

Пример инструкции SQL INSERT в этом ответе - это * замена * для текста SQL, отображаемого в вопросе (то есть строки, которая должна быть назначена в bookingInfo). – spencer7593

Смежные вопросы