Как я могу предотвратить вставку повторяющихся данных в таблицу SQL Server? - PullRequest
5 голосов
/ 26 ноября 2011

У меня есть ряд данных, которые нужно записать в SQL, что мне нужно сделать, чтобы проверить данные в SQL, чтобы предотвратить вставку в таблицу тех же данных?

Пример данных для вставки:

David  
James  
John  

Если четвертые данные снова равны John, я хочу, чтобы система пропустила дубликат записи (Джон).

Пока у меня есть:

SqlConnection myCnn = new SqlConnection(cnn);
String _state = "Insert into CamNo1(platename, date, camID, path, filename) OUTPUT INSERTED.platename values(@msg, getdate(), @camID, @path, @filename)";
SqlCommand _Query = new SqlCommand(_state, myCnn);

_Query.Parameters.AddWithValue("@msg", msg);
_Query.Parameters.AddWithValue("@camID", camID);
_Query.Parameters.AddWithValue("@path", imageFile);
_Query.Parameters.AddWithValue("@filename", name);

try
{
   myCnn.Open();
   string checkname = (string)_Query.ExecuteScalar();
   myCnn.Close();

   getcheckname = checkname;
   Console.WriteLine("OK");
}
catch (Exception)
{
}

iполучил строковое значение контрольного имени, которое вставлено последним, что мне делать, чтобы проверить данные?

Ответы [ 3 ]

6 голосов
/ 26 ноября 2011

Если вы не хотите дублировать данные, вам следует рассмотреть вопрос об их принудительном применении на уровне БД с помощью УНИКАЛЬНОГО СОПРЯЖЕНИЯ или УНИКАЛЬНОГО ИНДЕКСА

В SQL Server 2008 также есть оператор MERGE , который можно использовать для проверки соответствия записей. Это может быть полезно, если вы хотите обновить существующую запись.

5 голосов
/ 26 ноября 2011

Во-первых, вы можете предотвратить появление дубликата в таблице, используя уникальный индекс или ограничение.Индекс / ограничение может работать совместно с предложениями ниже.Если вы только используете уникальный индекс, а не одно из приведенных ниже решений, при вставке дублирующейся записи возникнет ошибка, и вам придется устранить ее на другом конце.

Кроме того, явероятно вставит данные через хранимую процедуру, которая проверяет, существует ли строка.Для этого вы можете использовать оператор MERGE , как показано в этом псевдокоде:

create procedure MyProcedure
(
    @Name nvarchar(100),
    ...
)
as

merge MyTable
using
(
    select @Name,...
) as source (Name, ...)
on MyTable.Name = source.Name
when not matched then
    insert (Name,...) values (source.Name,...)
when matched then
    update set Name = @Name,...

, или вы можете проверить наличие записей и вставить или обновить вручную:

create procedure MyProcedure
(
    @Name nvarchar(100),
    ...
)
as

    if not exists (select * from MyTable where Name = @Name)
    begin
        insert into MyTable (Name,...) values (@Name,...)
    end
    else
    begin
            update MyTable
            set ...
            where Name = @Name
    end
2 голосов
/ 26 ноября 2011

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

Если вы хотите простозапустите оператор hard insert, но если он существует, он ничего не делает, что-то вроде этого должно работать.Я проверил это на локальной базе данных:

declare @subject as varchar(100);
set @subject = 'hello'

insert into Subjects ([name]) 
select @subject 
where not exists (select 1 from Subjects where [name] = @Subject)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...