2011-03-25 24 views
8

SQL Server 2008/2005Khóa chính SQL có thể chấp nhận '0'?

Tôi đang nhầm lẫn giữa khóa chính và khóa duy nhất.

Tôi biết rằng khóa chính sẽ không cho phép NULL, trong khi Unique sẽ chấp nhận NULL. Ngoài ra, một bảng có thể có số 'n' các phím duy nhất ..!

Khóa chính có cho phép Zero không?

+0

chỉ là một nhận xét thông tin. câu hỏi này cũng có thể áp dụng cho 'mySql' – dhpratik

Trả lời

14

Khóa chính Có thể bằng không, nhưng nếu bạn đặt Nhận dạng trên cột, thông thường, cột này sẽ bắt đầu ở mức 1 thay vì Zero.

+0

Primary Key sẽ có Identity Column .. (Nhiều khả năng hoặc Most Scenario's) .. Vì vậy, tôi có thể giả định, nếu có một cột Identity chúng ta có thể bắt đầu hạt/increment bằng 0. Để bắt đầu bằng Zero thay vì 1, làm thế nào để làm điều đó? – goofyui

+0

Tại sao bạn lại muốn bắt đầu tăng tại Zero? Nhưng có bắt đầu hạt giống tại Zero, và sau đó tăng thêm một vì vậy nó sẽ là IDENTITY (0,1) –

+0

Tôi đã thử nghiệm kịch bản ..! Nếu không có Identity .., Primarykey sẽ cho phép Zero ..! – goofyui

3

Có. NULL là sự vắng mặt của một giá trị. 0 là một giá trị.

+0

Làm giả lập khóa chính ZERO? – goofyui

+0

Có. Phím chính hỗ trợ ZERO – climbage

7

Khóa chính có thể cho phép 0 tùy thuộc vào khóa học trên kiểu dữ liệu của khóa chính. Một PK tự nhận dạng (Identity) có thể bắt đầu ở 0 nhưng đó không phải là hành vi mặc định, bạn sẽ phải thiết lập nó để bắt đầu ở 0 (heck bạn có thể bắt đầu với số âm nếu bạn muốn). Để có kết quả tốt nhất, điều này nên được thực hiện trước khi bạn bắt đầu nhập dữ liệu vào bảng.

Điều bạn không thể làm là có nhiều bản ghi với số 0 là PK vì vi phạm yêu cầu duy nhất của PK.

Nếu bạn có dữ liệu hiện có và muốn bản ghi có giá trị bằng 0 cho mục đích cụ thể (ví dụ: chúng tôi đặt người dùng cho quá trình nhập của mình, do đó trường chèn vào có thể hiển thị bản ghi đến từ quá trình nhập) , thì điều bạn có thể muốn là cho phép chèn thủ công vào trường nhận dạng, vì vậy bạn có thể nhập bản ghi cụ thể này theo giá trị bạn muốn, sau đó quay lại cài đặt thông thường. Này được thực hiện theo cách này:

set Identity_insert dbo.table1 ON 
insert dbo.table1 (id, myfield) 
Values (0, 'test') 
set Identity_insert dbo.table1 OFF 

Đừng làm điều này trong mã sản xuất ứng dụng, đây là một loại hệ thống quản trị của nhiệm vụ mà chỉ nên được thực hiện thường xuyên cho một trong hai các thiết lập của một kỷ lục đặc biệt ngoài phạm vi bình thường dữ liệu hoặc để chèn các bản ghi chuyển từ một nguồn khác (khi bạn biết các giá trị id hiện tại của chúng hiện chưa được sử dụng). Điều này không nên được sử dụng một cách nhẹ nhàng để tránh những hạn chế của một lĩnh vực nhận dạng. Đặc biệt nó không bao giờ được sử dụng để điền vào các bản ghi mà danh tính bị bỏ qua (do xóa hoặc khôi phục) vì điều này đánh bại mục đích sử dụng danh tính và có thể gây ra vấn đề toàn vẹn dữ liệu nếu các mối quan hệ PK/FK thích hợp không được thiết lập.

+0

Cảm ơn bạn đã giải thích chi tiết và kỹ lưỡng, đây cũng là câu trả lời duy nhất để hiển thị CÁCH làm những gì OP hỏi, trong khi giải thích TẠI SAO không. Rực rỡ! – Rustavore

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