2013-01-24 32 views
27

Tôi hiện có:Thêm tên ràng buộc khoá ngoại trong một SQL Tạo tuyên bố

CREATE TABLE galleries_gallery (
    id    INT NOT NULL PRIMARY KEY IDENTITY, 
    title   NVARCHAR(50) UNIQUE NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL REFERENCES galleries_templates(id), 
    jsAltImgID  INT NOT NULL REFERENCES libraryImage(id) 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0 
); 

Nhưng điều này cho biết thêm khó khăn với tính năng tự tạo ra tên mà làm cho nó khó khăn để thả các hạn chế sau đó. Tôi cần thêm gì để đặt tên cho các ràng buộc?

Ví dụ trên là MSSQL tôi cũng cần nó trong postgresql

+0

đây là [create table] (http://msdn.microsoft .com/vi-us/library/ms174979.aspx) từ MSDN. 'rowguid uniqueidentifier ROWGUIDCOL NOT NULL CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (newid())' – Hiten004

Trả lời

52

Trong SQL Server, bạn có thể sử dụng từ khóa constraint để xác định nội tuyến khóa ngoại tuyến và đặt tên cho chúng cùng một lúc.

Dưới đây là kịch bản Cập nhật:

CREATE TABLE galleries_gallery (
    id    INT NOT NULL PRIMARY KEY IDENTITY, 
    title   NVARCHAR(50) UNIQUE NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL 
     CONSTRAINT FK_galerry_template 
     REFERENCES galleries_templates(id), 
    jsAltImgID  INT NOT NULL 
     CONSTRAINT FK_gallery_jsAltImg 
     REFERENCES libraryImage(id) 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0 
); 

Tôi chỉ cần thực hiện một thử nghiệm và dường như điều tương tự cũng hoạt động trong PostgreSQL: http://www.sqlfiddle.com/#!12/2ae29

+1

Trong Sqlite nó alose hoạt động. – PaulP

26
CREATE TABLE galleries_gallery (
    id    INT NOT NULL, 
    title   NVARCHAR(50) NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL, 
    jsAltImgID  INT NOT NULL, 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0, 
    CONSTRAINT galleries_gallery_id_pk PRIMARY KEY (id), 
    CONSTRAINT galleries_gallery_title_uk UNIQUE (title), 
    CONSTRAINT galleries_gallery_tmpltid_fk FOREIGN KEY (templateID) REFERENCES galleries_templates (id), 
    CONSTRAINT galleries_gallery_jsAltImgIDfk FOREIGN KEY (isAltImgID) REFERENCES libraryImage (id) 
); 

Sử dụng các từ khóa CONSTRAINT để xác định tên hạn chế. IMO nó sạch hơn và dễ đọc hơn để làm điều này cuối cùng của TABLE hơn là trong dòng (cả hai đều được chấp nhận, như câu trả lời thứ hai cho biết), và điều này cũng cho phép bạn tạo các ràng buộc UNIQUE trên nhiều cột, cũng như nhiều FK vào cùng một bảng. Từ khóa CONSTRAINT không thể được sử dụng cho không null; một thay đổi đối với một ràng buộc không null đòi hỏi một ALTER TABLE MODIFY COLUMN ... null. Tên hạn chế phải nhỏ hơn hoặc bằng 30 ký tự. Sử dụng quy ước đặt tên chuẩn. Cá nhân tôi luôn sử dụng tên bảng được thêm vào tên cột, được sắp xếp nếu tên ràng buộc trên 30 ký tự, theo sau là loại ràng buộc (pk, fk, uk, v.v.)

+0

Trong khi tôi có thể thấy rằng câu trả lời của bạn là gọn gàng, tôi sẽ áp dụng câu trả lời của w0lf trong trường hợp này vì nó phù hợp với những gì tôi đang tìm kiếm. – Rumpleteaser

+7

@LauraHansen chỉ cần lưu ý rằng cú pháp mà bạn thêm các ràng buộc ở cuối định nghĩa bảng là linh hoạt hơn, trong trường hợp bạn có các ràng buộc nhiều cột. –

+1

Đây là câu trả lời đúng hơn theo nhận xét của @ AaronBertrand. Tuy nhiên, điều quan trọng cần lưu ý là trong MSSQL ít nhất, giới hạn độ dài tối đa của tên là 128 ký tự. –

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