INSERT INTO, если не существует SQL-сервер - PullRequest
14 голосов
/ 10 марта 2012

У меня есть база данных, структурированная следующим образом:

Пользователи

userid (Primary Key)
username

группа

groupid (PK)
groupName

user_groups

userid (Foreign Key)
groupid (Foreign Key)

При первом входе пользователя в систему я бы хотел, чтобы его информация была добавлена ​​в таблицу пользователей. Так что, по сути, логика, которую я хотел бы иметь, если

if (//users table does not contain username)
{
INSERT INTO users VALUES (username);
}

Как я могу сделать это разумно, используя SQL Server / C #?

Ответы [ 8 ]

19 голосов
/ 10 марта 2012

Или используя новый синтаксис MERGE:

merge into users u
using ( 
   select 'username' as uname
) t on t.uname = u.username
when not matched then 
  insert (username) values (t.uname);
10 голосов
/ 10 марта 2012

В основном вы можете сделать это так:

IF NOT EXISTS (SELECT * FROM USER WHERE username = @username)
    INSERT INTO users (username) VALUES (@username)

А если серьезно, как вы узнаете, посетил ли пользователь ваш сайт впервые? Вы должны вставить записи в таблицу user, когда кто-то регистрируется на вашем сайте, а не авторизируется.

4 голосов
/ 10 марта 2012
IF NOT EXISTS (select * from users where username = 'username')
BEGIN
    INSERT INTO ...
END
3 голосов
/ 11 марта 2012

Сначала я создал бы сохраненный процесс в БД, чтобы выполнить проверку, и вставил, если необходимо:

CREATE PROCEDURE AddNewUserProc
(
@username       VarChar(50) -- replace with your datatype/size
)

AS

    IF NOT EXISTS (SELECT * FROM users WHERE username = @username)
    BEGIN
        INSERT INTO users
        VALUES (@username)
    END

Затем в приложение был вызван метод, который вызовет эту процедуру

public void AddNewUserMethod(string userName)
{
    SqlConnection connection = new SqlConnection("connection string");
    SqlCommand command = new SqlCommand("AddNewUserProc", connection);

    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("username", SqlDbType.VarChar, 50).Value = userName;

    try
    {
        connection.Open();
        command.ExecuteNonQuery();
    }
    finally
    {
        if (connection.State == ConnectionState.Open) { connection.Close(); }
    }
}
1 голос
/ 19 февраля 2014

@ gbn для ответа требуется SQL Server 2008 или выше. Я попытался сделать это без слияния. Может быть, некрасиво, но это работает.

declare @user varchar(50)
set @user = 'username'
insert into users (username) 
select @user
where not exists (
 select username 
 from users 
 where username = @user
);

Если вы хотите проверить любой из ответов, вот SQL для таблицы -

CREATE TABLE [dbo].[users](
    [userid] [int] NULL,
    [username] [varchar](50) NULL
)

INSERT [dbo].[users] ([userid], [username]) VALUES (1, N'John')
INSERT [dbo].[users] ([userid], [username]) VALUES (2, N'David')
INSERT [dbo].[users] ([userid], [username]) VALUES (3, N'Stacy')
INSERT [dbo].[users] ([userid], [username]) VALUES (4, N'Arnold')
INSERT [dbo].[users] ([userid], [username]) VALUES (5, N'Karen')
1 голос
/ 10 марта 2012

Следующий код является методом, который возвращает 0, если пользователь уже существует, и возвращает нового пользователя ID , который только что был добавлен:

  private int TryToAddUser(string UserName)
        {
            int res = 0;
            try
            {
                string sQuery = " IF NOT EXISTS (select * from users where username = @username) \n\r" + 
                " BEGIN \n\r" + 
                "     INSERT INTO users values (@username) \n\r" + 
                " SELECT SCOPE_IDENTITY() \n\r " + 
                " END \n\r " + 
                " ELSE SELECT 0";
                using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
                {
                    cmd.CommandText = sQuery;
                    cmd.Parameters.AddWithValue("@username",UserName);
                    cmd.Connection = new System.Data.SqlClient.SqlConnection("SomeSqlConnString");
                    cmd.Connection.Open();
                    res = (int)cmd.ExecuteScalar();
                    cmd.Connection.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return res;
        }
0 голосов
/ 09 декабря 2018

Есть простое решение!Я нашел это в этой записи !

INSERT INTO users (Username) 
SELECT ('username')
WHERE NOT EXISTS(SELECT * FROM users WHERE Username= 'username')

В моем проекте мне нужно было сделать это с 2 значениями.Поэтому мой код был:

INSERT INTO MyTable (ColName1, ColName2) 
SELECT 'Value1','Value2' 
WHERE NOT EXISTS
(SELECT * FROM MyTable WHERE ColName1 = 'Value1' AND ColName2= 'Value2')

Надеюсь, это поможет!

0 голосов
/ 10 марта 2012

Вот (возможно, упрощенный) пример, который решает вашу проблему. Обратите внимание, что всегда лучше использовать параметры для предотвращения инъекционных атак, особенно при проверке пользователей.

CREATE PROCEDURE AddUser
  @username varchar(20)
AS
  IF NOT EXISTS(SELECT username FROM users WHERE username=@username)
    INSERT INTO users(username) VALUES (@username)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...