2015-05-07 3 views
0

Возможно ли сначала вставить запись, если она не существует, а затем получить значение в одной записи VALUES?Возможно ли иметь несколько команд SQL в одной записи VALUES?

Что-то вроде этого:

INSERT INTO Sections(data) VALUES(
    (INSERT OR IGNORE INTO Courses(column) WHERE column='test' 
    SELECT id FROM Courses WHERE column='test') 
) 

Итак, сначала я вставив значение, если не существует в раздел, где значение ссылочного из другой таблицы. Это может не существовать, поэтому я хочу вставить его, а затем я хочу захватить этот «идентификатор» нового ввода курса.

Is is?

+0

Dont думаю, что его можно. Возможно, вы захотите использовать предложение 'CASE..WHEN..THEN ... END' для проверки нулевых значений, но это не будет' INSERT' данные во вторую таблицу –

+0

Я не совсем уверен, правильно понял ли вы вас. Я предполагаю, что вы хотите: 1. Вставить в Курс новую строку с заданным значением «столбец», если она не существует 2. Вставить в выборку значение «id» из таблицы «Курсы», где «Столбец» курсов имеет это значение вы просто вставили в пункт 1. Это правильно? – Googie

ответ

1

SQLite - это встроенная база данных; он предназначен для использования вместе с «реальным» языком программирования, который может выполнять всю логику.

Сначала выполните сначала SELECT, а затем, если необходимо, выполните INSERT.

Если id столбец INTEGER PRIMARY KEY, вы можете получить его значение с last_insert_rowid:

using (SqlTransaction tx = connection.BeginTransaction()) 
{ 
    string sql = "SELECT id FROM Courses WHERE column = @Name"; 
    SqlCommand cmd = new SqlCommand(sql, connection); 
    cmd.Parameters.Add("@Name", SqlDbType.VarChar); 
    cmd.Parameters["@Name"].Value = ...; 
    Object id = cmd.ExecuteScalar(); 
    if (id == null) 
    { 
     sql = "INSERT INTO Courses(Name) VALUES(@Name)"; 
     SqlCommand cmd = new SqlCommand(sql, connection); 
     cmd.Parameters.Add("@Name", SqlDbType.VarChar); 
     cmd.Parameters["@Name"].Value = ...; 
     cmd.ExecuteNonQuery(); 
     id = cmd.ExecuteScalar("SELECT last_insert_rowid()"); 
    } 
    tx.Commit(); 
} 
+0

Я не мог найти решение, которое могло бы работать для моей ситуации. У вас есть пример? – HelpNeeder

+0

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

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