2009-09-09 13 views
31

Đây là câu hỏi tiếp theo từ câu hỏi tôi yêu cầu here.Có thể có những ràng buộc có cùng tên trong DB không?

Các ràng buộc trong DB có cùng tên không?

Nói rằng tôi có:

CREATE TABLE Employer 
(
    EmployerCode VARCHAR(20) PRIMARY KEY, 
    Address   VARCHAR(100) NULL 
) 


CREATE TABLE Employee 
(
    EmployeeID  INT   PRIMARY KEY, 
    EmployerCode VARCHAR(20) NOT NULL, 
    CONSTRAINT employer_code_fk FOREIGN KEY (EmployerCode) REFERENCES Employer 
) 


CREATE TABLE BankAccount 
(
    BankAccountID INT   PRIMARY KEY, 
    EmployerCode VARCHAR(20) NOT NULL, 
    Amount   MONEY   NOT NULL, 
    CONSTRAINT employer_code_fk FOREIGN KEY (EmployerCode) REFERENCES Employer 
) 

là cho phép điều này? Liệu nó phụ thuộc vào DBMS (Tôi đang trên SQL Server 2005)? Nếu nó không được phép, có ai có bất cứ đề nghị về cách làm việc xung quanh nó?

Trả lời

37

Không - ràng buộc là đối tượng cơ sở dữ liệu, và do đó tên của nó cần phải là duy nhất.

Thử thêm ví dụ: tên bảng cho ràng buộc của bạn, theo cách đó nó sẽ là duy nhất.

CREATE TABLE BankAccount 
(
    BankAccountID INT   PRIMARY KEY, 
    EmployerCode VARCHAR(20) NOT NULL, 
    Amount   MONEY   NOT NULL, 
    CONSTRAINT FK_BankAccount_Employer 
     FOREIGN KEY (EmployerCode) REFERENCES Employer 
) 

Chúng tôi về cơ bản sử dụng "FK _" (bảng con) _ (bảng cha)" để đặt tên cho các ràng buộc và khá hài lòng với quy ước đặt tên này.

Thông tin từ MSDN

Đó các tên ràng buộc phải là duy nhất đối với lược đồ (ví dụ: hai lược đồ khác nhau trong cùng một cơ sở dữ liệu có thể chứa cả ràng buộc có cùng tên) không được ghi rõ ràng, thay vào đó bạn cần giả định các định danh của các đối tượng cơ sở dữ liệu phải là duy nhất trong lược đồ trừ khi được chỉ định erwise. Vì vậy, tên ràng buộc là defined là:

Là tên của ràng buộc. Các tên ràng buộc phải tuân thủ các quy tắc cho mã định danh, ngoại trừ tên không thể bắt đầu bằng một dấu hiệu số (#). Nếu constraint_name không được cung cấp, một tên do hệ thống tạo được gán cho ràng buộc.

Hãy so sánh này đến tên của một index:

Là tên của chỉ số. Tên chỉ mục phải là duy nhất trong bảng hoặc chế độ xem nhưng không phải là duy nhất trong cơ sở dữ liệu. Tên chỉ mục phải tuân thủ các quy tắc của số nhận dạng.

rõ ràng thu hẹp phạm vi của số nhận dạng.

+0

+1: Chúng tôi đã sử dụng các chữ cái đầu tiên của các từ tạo tên bảng làm tiền tố. –

7

Tôi luôn bối rối lý do tại sao tên ràng buộc phải là duy nhất trong cơ sở dữ liệu, vì chúng có vẻ như chúng được liên kết với các bảng.

Sau đó, tôi đọc về ràng buộc ASSERTION của SQL-99, giống như ràng buộc kiểm tra, nhưng tồn tại ngoài bất kỳ bảng đơn nào. Các điều kiện được khai báo trong một xác nhận phải được thỏa mãn nhất quán như bất kỳ ràng buộc nào khác, nhưng xác nhận có thể tham chiếu nhiều bảng.

AFAIK không có nhà cung cấp SQL nào thực hiện các ràng buộc ASSERTION. Nhưng điều này giúp giải thích lý do tại sao các tên hạn chế là toàn bộ cơ sở dữ liệu trong phạm vi.

+1

tốt, ngay cả khi hạn chế xác nhận không được triển khai: bạn có muốn có ba ràng buộc khóa ngoài cùng tên không? Nếu bạn nhận được một lỗi vi phạm FK nêu rõ tên của FK - làm thế nào để bạn biết cái nào trong số đó thực sự là của nó? Tôi nghĩ rằng việc thực thi các tên ràng buộc duy nhất là "Điều tốt (tm)" :-) –

+0

Có, chắc chắn. Tôi đã làm cho điểm rằng "đó là trong tiêu chuẩn ANSI SQL theo cách đó", nhưng điểm của bạn thậm chí còn thực tế hơn. –

0

Thực hành tốt là tạo chỉ mục và hạn chế tên chỉ định tên bảng ngay từ đầu. Có 2 cách tiếp cận, với chỉ mục/loại ràng buộc ở đầu hoặc cuối) ví dụ.

UQ_TableName_FieldName 

hoặc

TableName_FieldName_UQ 

tên phím nước ngoài cũng nên chứa tên của tham chiếu Bảng/Field (s).

Một trong các quy ước đặt tên tốt là đặt tên bảng theo dạng FullName_3LetterUniqueAlias ​​ví dụ:

Employers_EMR 
Employees_EMP 
BankAccounts_BNA 
Banks_BNK 

này cung cấp cho bạn cơ hội để sử dụng "được xác định trước" bí danh trong các truy vấn trong đó cải thiện khả năng đọc và cũng làm Đặt tên phím nước ngoài dễ dàng hơn, như:

EMPEMR_EmployerCode_FK 
BNKEMR_EmployerCode_FK 
16

Những câu trả lời khác đều tốt, nhưng tôi nghĩ rằng tôi 'd thêm một câu trả lời cho câu hỏi trong tiêu đề, tức là "có thể có những ràng buộc có cùng tên trong DB không?"

Câu trả lời cho MS SQL Server là có - nhưng chỉ miễn là các ràng buộc đang ở trong các lược đồ khác nhau emas. Tên ràng buộc phải là duy nhất trong một lược đồ.

1

Điều đó có phụ thuộc vào DBMS (Tôi đang sử dụng SQL Server 2005) không?

Có, rõ ràng là tùy thuộc vào DBMS.

Câu trả lời khác nói rằng nó không được phép, nhưng tôi có cơ sở dữ liệu MS SQL CE ("Compact Edition"), trong đó tôi vô tình tạo thành công hai đường viền FK, trong hai bảng, với cùng một tên.

0

Tùy thuộc vào DBMS.

Ví dụ trên PostgreSQL, câu trả lời là :

Vì PostgreSQL không yêu cầu tên hạn chế là duy nhất trong một schema (nhưng chỉ mỗi bảng), có thể là có nhiều kết quả phù hợp cho tên ràng buộc được chỉ định.

Nguồn: https://www.postgresql.org/docs/current/static/sql-set-constraints.html

Tôi đã nhìn thấy Keys nước ngoài tên hạn chế bằng trên 2 bảng khác nhau trong cùng một giản đồ.

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