2010-11-07 30 views
65

Tôi có một Quản trị viên bảng chỉ với một cột, adminId là khóa chính. Bởi vì các quy tắc kinh doanh, nó phải theo cách này.Chèn các hàng vào một bảng với một cột IDENTITY chỉ

Tôi muốn hiểu một lần và cho tất cả cách tôi có thể viết các thủ tục được lưu trữ chèn giá trị vào các bảng như thế này. Tôi đang sử dụng SQL Server và T-SQL và đã thử sử dụng SCOPE_IDENTITY() nhưng điều đó không hoạt động vì bảng có INSERT_IDENTITY thành false hoặc off.

Tôi thực sự không muốn chèn giá trị giả chỉ để có thể chèn hàng mới. Cảm ơn!

+1

Để làm rõ: câu hỏi của bạn là "cách chèn hàng trong bảng SQL Server với một cột IDENTITY"? – gbn

+0

Có, bạn nói đúng, cảm ơn bạn đã làm rõ – Phil

+1

Đối với những người đến đây, câu hỏi này đã được hỏi trước và câu trả lời đúng là ở đây: http: // stackoverflow.com/questions/850327/how-to-insert-in-a-table-với-chỉ-một-nhận dạng-cột – BJury

Trả lời

111

Nếu bạn có một cột là IDENTITY, chỉ cần thực hiện điều này

INSERT MyTable DEFAULT VALUES; --allows no column list. The default will be the IDENTITY 
SELECT SCOPE_IDENTITY(); 

Nếu bạn không có danh tính, bạn có thể đặt nó không? Đây là cách tốt nhất .. và sử dụng SQL ở trên.

Nếu không, bạn muốn chèn một hàng mới

INSERT MyTable (admidid) 
OUTPUT INSERTED.admidid --returns result to caller 
SELECT ISNULL(MAX(admidid), 0) + 1 FROM MyTable 

Ghi chú:

  • Dưới tải cao giải pháp MAX có thể thất bại với bản sao
  • SCOPE_IDENTITY là sau thực tế, không phải trước
  • SCOPE_IDENTITY chỉ hoạt động với cột IDENTITY. Ditto bất kỳ ngu ngốc sử dụng IDENT_CURRENT
  • Mệnh đề đầu ra thay thế SCOPE_IDENTITY cho các giải pháp MAX
+0

Cảm ơn bạn, nhưng ý của bạn là gì với "trùng lặp"? – Phil

+3

Đề xuất đầu tiên của bạn hoạt động tốt. Cảm ơn! – Phil

+0

@Phil: Bạn được chào đón. "duplicateTes" là lỗi đánh máy :) – gbn

0

Bạn cần phải thêm các IDENTITY_INSERT để tuyên bố chọn của bạn:

SET IDENTITY_INSERT MyTable ON 

INSERT INTO MyTable 
(AdminCol) 

SELECT AdminColValue 

FROM Tableb 

Khi bạn đã hoàn tất, chắc chắn rằng bạn nhớ để

SET IDENTITY_INSERT MyTable OFF 

Dưới đây là một mô tả tốt về cách thức hoạt động từ BOL : http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx

+0

Tôi có thể làm như sau: SET IDENTITY_INSERT Administrator ON INSERT INTO Administrator (SCOPE_IDENTITY()) SET IDENTITY_INSERT Quản trị viên OFF ? – Phil

+0

Có. Đó là tất cả những gì bạn cần làm. SET ON, viết mã của bạn, SET OFF ở cuối. – DataWriter

+0

Tôi không nghĩ đây là câu trả lời đúng. Nếu đó là cột nhận dạng, bạn không nên thêm giá trị vào cột đó. Câu trả lời được chấp nhận là câu trả lời đúng. – Mmm

0

@Phil: Đừng bạn có nghĩa là bảng của bạn có hai (2) cột, cột PK autoincrementing và một cột AdminName? Nếu nó chỉ có một cột nơi AdminName đi, AdminName là PK và bạn không thể autoincrement một chuỗi, tất nhiên. Các quy tắc kinh doanh có mong đợi bạn tạo một tên người dùng Windows đủ điều kiện là khóa chính không? Điều đó sẽ là khả thi và có ý nghĩa, bởi vì sau đó bạn sẽ không cần một chỉ mục duy nhất thay thế trên cột AdminName.

Nhưng nếu bàn của bạn có hai cột, không phải là một:

Trong SQLServer các autoincrement là một phần của định nghĩa bảng/cột. Bạn xác định cột dưới dạng số nguyên và sau đó cũng làm cột đó thành cột số , chỉ định số gia tăng, thường là 1, nhưng có thể là 2 hoặc 5 hoặc 10 hoặc bất kỳ thứ gì. Để chèn một hàng, bạn chỉ cần chèn cột khác (s) giá trị (s) và không phải làm gì với cột PK:

insert into T 
(foo) -- column(s) list 
values('bar') -- values list 

proc lưu trữ của bạn mà không được chèn có thể làm cho SCOPE_IDENTITY một giá trị RETURN hoặc SCOPE_IDENTITY có thể truyền lại cho máy khách như một tham số OUT.

P.S.SCOPE_IDENTITY() trả về giá trị nhận dạng tự động được tạo gần đây nhất trong phạm vi hiện tại; nó không tạo ra giá trị nhận dạng tiếp theo.

EDIT:

Có lẽ, bảng Quản trị viên của bạn chứa một nhóm quản trị viên. Nhưng nếu nó không có cột nào khác hơn cột số nguyên chính, thì không có cách nào để xác định người quản trị; điều duy nhất bạn có thể làm là phân biệt chúng với nhau. Điều đó không mang lại cho bạn rất nhiều ở tất cả. Nhưng nếu bảng quản trị của bạn có một trong các cấu trúc sau:

ID INTEGER PRIMARY KEY AUTOINCREMENT 
windowsusername varchar(50) (unique index) 

HOẶC

windowsusername varchar(50) primary key 

bạn sẽ có thể tham khảo bảng của quản trị từ các bảng khác, và các phím nước ngoài sẽ có ý nghĩa. Và đó là chính xác những gì một bảng bao gồm một cột nguyên duy nhất thiếu - ý nghĩa.

Có hai cột, sau đó bạn có thể có một thủ tục lưu trữ làm điều này:

insert into Administrators 
(windowsusername) 
values('mydomain\someusername'); 
return SCOPE_IDENTITY(); 

và client-chương trình của bạn sẽ trở lại như một giá trị trả về id autoincremented đã được autogenerated và giao cho mới được chèn vào hàng. Cách tiếp cận này là thực hành thông thường, và tôi sẽ đi xa như vậy để nói rằng nó được coi là "thực hành tốt nhất".

P.S. Bạn đề cập đến rằng bạn không biết làm thế nào để "chèn một giá trị" nếu bạn "không có bất cứ điều gì để chèn". Có một mâu thuẫn ở đó. Nếu bạn không có gì để chèn, tại sao chèn? Tại sao bạn sẽ tạo ra, nói, một hồ sơ KHÁCH HÀNG mới nếu bạn biết hoàn toàn không có gì về khách hàng? Không phải tên của họ, thành phố của họ, số điện thoại của họ, không có gì?

+2

Bảng của tôi có một cột, adminId, là giá trị int gia tăng – Phil

+0

Đó là thiết kế kỳ lạ nhất mà tôi từng thấy, và tôi đã làm việc trong hơn 20 năm và đã thấy một số điều kỳ lạ trong ngày. Vì vậy, câu hỏi của bạn là, Làm thế nào để bạn chèn vào một bảng có chứa chỉ một cột khóa chính được định nghĩa như một cột nhận dạng tự động, khi bảng chứa cột PK và chỉ cột PK đó, không có cột nào khác .. – Tim

+0

Vì vậy, những gì downvote cho ? Một lỗi thực tế ở đâu đó hoặc để thể hiện một ý kiến ​​về việc thiếu công đức của thiết kế? – Tim

-2

Bất cứ khi nào chúng tôi đặt thuộc tính nhận dạng của cột “Bật”, chúng tôi không cần chèn giá trị vào cột đó một cách rõ ràng. SQL Server ngầm chèn các giá trị vào cột nhận dạng dựa trên giá trị gia tăng. Ở đây chúng ta sẽ thấy cách chúng ta có thể chèn các giá trị vào cột nhận dạng một cách rõ ràng. Trước hết, chúng ta sẽ tạo một bảng với cột nhận dạng.

Dưới đây là kịch bản để tạo bảng với cột sắc: -

create table Identitytable(id int identity,Name varchar(50)) 

Trong bảng “Identitytable”, tôi đã xác định “Id” cột như một cột sắc. Cho phép chèn vài hàng vào bảng này mà không chèn giá trị vào cột “Id” một cách rõ ràng.

insert into Identitytable(Name) values('Neeraj') 
insert into Identitytable(Name) values('Raj') 
insert into Identitytable(Name) values('Akshay') 
insert into Identitytable(Name) values('Ankit') 
insert into Identitytable(Name) values('Vikas') 

Chúng tôi sẽ chạy kịch bản trên để chèn 5 hàng vào bảng “Identitytable” và hãy kiểm tra nội dung được chèn vào bảng.

Trong hình trên, chúng ta có thể thấy giá trị cho cột id (1,2,3,4,5), trong khi chúng tôi không chèn giá trị vào cột “Id” một cách rõ ràng. Bây giờ, hãy cố gắng chèn các giá trị vào cột "Id" một cách rõ ràng.

Trong tập lệnh bên dưới, chúng tôi đang cố chèn giá trị “9” vào cột “Id” một cách rõ ràng, hãy xem kết quả của truy vấn chèn bên dưới là gì.

insert into Identitytable(Id,Name) values(9,'Mamta') 
+2

Một bản sao + dán bài viết khác từ blog của bạn. Làm ơn đừng làm thế! Chúng tôi không quan tâm đến một số bài đăng tự viết blog hữu ích, nếu nó là _genuinely_ có liên quan, nhưng không phải với mọi câu trả lời, xin vui lòng. – halfer

Các vấn đề liên quan