2012-03-10 58 views
14

tôi có một cơ sở dữ liệu có cấu trúc như sau:INSERT INTO nếu không tồn tại SQL server

người dùng

userid (Primary Key) 
username 

nhóm

groupid (PK) 
groupName 

user_groups

userid (Foreign Key) 
groupid (Foreign Key) 

Lần đầu tiên người dùng đăng nhập, tôi muốn thông tin của họ được thêm vào bảng người dùng. Về cơ bản, logic tôi muốn có nếu

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

Làm cách nào để sử dụng SQL Server/C# một cách thông minh?

Trả lời

19

Hoặc sử dụng cú pháp MERGE mới:

merge into users u 
using ( 
    select 'username' as uname 
) t on t.uname = u.username 
when not matched then 
    insert (username) values (t.uname); 
+0

Đẹp (mặc dù có thể không cần thiết khi chỉ có một hành động duy nhất được dự tính) –

+1

@Damien_The_Unbeliever - Điều đáng xem xét khi bạn có [đồng thời cao] (http://dba.stackexchange.com/a/13384/2103). Có lẽ không phải là trường hợp ở đây nhưng +1 từ tôi. –

+0

@MikaelEriksson - bạn cho biết nó vẫn cần 'serializable' để tránh một số vấn đề - liệu có một số khác biệt rõ ràng giữa phương pháp này và các cách tiếp cận khác không? –

10

Về cơ bản bạn có thể làm điều đó như thế này:

if NOT exists (select * from user where username = @username) 
    insert into users values (username) 

Nhưng nghiêm túc, làm thế nào bạn sẽ biết nếu người dùng truy cập trang web của bạn lần đầu tiên? Bạn phải chèn bản ghi vào bảng người dùng, khi ai đó đăng ký trên trang web của bạn, không đăng nhập.

+0

@Damien_The_Unbeliever, Cảm ơn bạn! – user194076

+4

Trên một lưu ý hoàn toàn - bạn đã kiếm được hơn 1K đại diện cho đến nay - đó không phải là thời gian để chọn một tên phong nha? –

+0

Tôi sẽ biết nếu họ đang đăng nhập lần đầu tiên kể từ khi tên của họ sẽ có trong cơ sở dữ liệu! Không có đăng ký trên trang web của tôi; Tôi sử dụng xác thực bên ngoài từ một trang web khác :). Cảm ơn vì sự trả lời! –

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

Đây là một (có thể là quá đơn giản hóa) ví dụ nhằm giải quyết vấn đề của bạn. Lưu ý rằng cách tốt nhất là sử dụng các tham số để ngăn chặn các cuộc tấn công tiêm, đặc biệt là khi xác minh người dùng.

CREATE PROCEDURE AddUser 
    @username varchar(20) 
AS 
    IF NOT EXISTS(SELECT username FROM users WHERE [email protected]) 
    INSERT INTO users(username) VALUES (@username) 
1

Các mã sau đây là một phương pháp mà trả về 0 nếu người dùng đã tồn tại và trả về mới dùng ID mà chỉ nói thêm:

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; 
     } 
3

đầu tiên tôi sẽ tạo ra một proc được lưu trữ trên db để làm việc kiểm tra và chèn nếu cần thiết:

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 

Sau đó, một phương pháp trên ứng dụng đó sẽ gọi thủ tục này

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

@gbn câu trả lời cần SQL server 2008 trở lên. Tôi đã thử một cách không hợp nhất để làm điều đó. Ugly có lẽ, nhưng nó hoạt động.

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

Nếu bạn muốn kiểm tra bất kỳ các câu trả lời, đây là SQL cho bảng -

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') 
Các vấn đề liên quan