Как перезаписать повторяющиеся данные в базе данных эффективным способом? - PullRequest
1 голос
/ 16 декабря 2011

Я использую Sql server 2008 для хранения своих данных, и структура таблицы выглядит так:

index float  not null,
type int   not null,
value int  not null,

и (index, type) уникальны. Нет двух данных с одинаковым индексом и одинаковымиtype.

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

  1. Большая часть пары индекс-тип данных не существует в таблице. Поэтому операция выбора является пустой, особенно таблицаогромен.

  2. Когда я использую C # или другой язык CLR для вставки данных, я не могу использовать пакетное копирование или пакетную вставку.

есть ли способ перезаписать данные напрямую, не проверяя, есть ли они в таблице?

Ответы [ 3 ]

4 голосов
/ 16 декабря 2011

Если вы хотите обновить ИЛИ вставить данные, вам нужно использовать merge:

merge MyTable t using (select @index index, @type type, @value value) s on
    t.index = s.index
    and t.type = s.type
when not matched insert (index, type value) values (s.index, s.type, s.value)
when matched update set value = s.value;

. При этом будут проверены ваши значения и выполнены соответствующие действия.

Чтобы сделать это в C #, вы должны использовать традиционный SqlClient:

SqlConnection conn = new SqlConnection("Data Source=dbserver;Initial Catalog=dbname;Integrated Security=SSPI;");
SqlCommand comm = new SqlCommand();
conn.Open();
comm.Connection = conn;

//Add in your values here
comm.Parameters.AddWithValue("@index", index);
comm.Parameters.AddWithValue("@type", type);
comm.Parameters.AddWithValue("@value", value);

comm.CommandText = 
    "merge MyTable t using (select @index index, @type type, @value value) s on " +
        "t.index = s.index and t.type = s.type " +
    "when not matched insert (index, type value) values (s.index, s.type, s.value) " +
    "when matched update set value = s.value;"
comm.ExecuteNonQuery();

comm.Dispose();
conn.Close();
conn.Dispose();
0 голосов
/ 16 декабря 2011

Другие ответы рекомендуют ограничения. Создание ограничений просто означает, что вы будете выполнять операторы вставки, которые вызывают ошибки. Следующим шагом (после создания ограничений) будет что-то вроде INSERT ON DUPLICATE KEY UPDATE , который, очевидно, имеет эквивалент Sql Server.

0 голосов
/ 16 декабря 2011

Вы должны превратить (index, type) в составной первичный ключ (он же составной ключ).

Это позволит гарантировать, что таблица может иметь только уникальные пары (я предполагаю,таблица уже не имеет первичного ключа).

Если таблица имеет первичный ключ, вы можете добавить UNIQUE ограничение к столбцам с аналогичным эффектом.

После определения это означает, что любая попыткавставить дублирующую пару не удастся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...