복붙노트

[SQL] INSERT INTO는 그렇지 않은 경우 SQL 서버에 존재

SQL

INSERT INTO는 그렇지 않은 경우 SQL 서버에 존재

나는 다음과 같이 데이터베이스 구성이 있습니다

사용자

userid (Primary Key)
username

그룹

groupid (PK)
groupName

user_groups

userid (Foreign Key)
groupid (Foreign Key)

사용자가 I에 로그인 처음으로 자신의 정보가 사용자의 테이블에 추가하고 싶습니다. 그래서 기본적으로 논리가 나는 경우 싶은

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

어떻게하면이 지능적으로 사용하는 SQL 서버 / C #을 할 수 있습니까?

해결법

  1. ==============================

    1.또는 새로운 MERGE 구문을 사용하여 :

    또는 새로운 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);
    
  2. ==============================

    2.기본적으로 당신이 이런 식으로 작업을 수행 할 수 있습니다 :

    기본적으로 당신이 이런 식으로 작업을 수행 할 수 있습니다 :

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

    그러나 심각하게, 당신은 사용자가 처음 웹 사이트를 방문하면 알거야 어떻게? 귀하의 웹 사이트에 누군가 레지스터가 아닌 로그인 테이블 사용자의 레코드를 삽입해야합니다.

  3. ==============================

    3.

    IF NOT EXISTS (select * from users where username = 'username')
    BEGIN
        INSERT INTO ...
    END
    
  4. ==============================

    4.내가 먼저 체크를하고 필요한 경우 삽입 할 DB에 저장된 프로 시저를 만들 것입니다 :

    내가 먼저 체크를하고 필요한 경우 삽입 할 DB에 저장된 프로 시저를 만들 것입니다 :

    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(); }
        }
    }
    

    참고, 참조 / 대안 역사적으로 이것을두고 있지만, 정확성의 목적을 위해 올바른 방법은 병합 문을 사용하고 대답 https://stackoverflow.com/a/9649040/167304 또는 체크 아웃 MS의 문서 https://docs.microsoft.com / EN-US는 / SQL / T-SQL / 문 / 병합-TRANSACT-SQL?보기 = SQL 서버-ver15

  5. ==============================

    5.다음 코드는 방법입니다 0을 반환 사용자가 이미 존재하고 방금 추가 한 새 사용자 ID를 반환하는 경우 :

    다음 코드는 방법입니다 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;
            }
    
  6. ==============================

    6.@gbn 대답은 SQL 서버 2008 이상이 필요합니다. 나는 그것을 할 수있는 비 병합 방법을 시도했다. 못생긴 아마도,하지만 작동합니다.

    @gbn 대답은 SQL 서버 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')
    
  7. ==============================

    7.간단한 해결책이 있습니다! 이 게시물에서 발견!

    간단한 해결책이 있습니다! 이 게시물에서 발견!

    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')
    

    도움이 되었기를 바랍니다!

  8. ==============================

    8.여기에 귀하의 문제를 해결하는 (아마도 간략화 됨) 예입니다. 이 사용자를 확인할 때 특히 주입 공격을 방지하기 위해 항상 사용하는 매개 변수에 가장 유의하십시오.

    여기에 귀하의 문제를 해결하는 (아마도 간략화 됨) 예입니다. 이 사용자를 확인할 때 특히 주입 공격을 방지하기 위해 항상 사용하는 매개 변수에 가장 유의하십시오.

    CREATE PROCEDURE AddUser
      @username varchar(20)
    AS
      IF NOT EXISTS(SELECT username FROM users WHERE username=@username)
        INSERT INTO users(username) VALUES (@username)
    
  9. from https://stackoverflow.com/questions/9648934/insert-into-if-not-exists-sql-server by cc-by-sa and MIT license