2016-03-26 100 views
0

有什麼語法如下區別:使用或不使用約束

CONSTRAINT user_roles_id_pk PRIMARY KEY(role_id), 
CONSTRAINT students_role_id_fk FOREIGN KEY(student_id) REFERENCES students(student_id), 
CONSTRAINT ratings_institute_id_fk FOREIGN KEY(institute_id) REFERENCES institutes(institute_id) ON DELETE CASCADE, 
CONSTRAINT ratings_ip_uq UNIQUE(ip) 

PRIMARY KEY (role_id), 
FOREIGN KEY (student_id) REFERENCES students(student_id) 
UNIQUE(ip) 
FOREIGN KEY (institute_id) REFERENCES institutes(institutes_id) ON DELETE CASCADE, 

我使用的第一套代碼,而編寫創建在Oracle SQL Developer中陳述。不幸的是,我不得不將oracle代碼轉換爲mysql以在xampp上運行。

+0

第一組給出的約束第二個沒有按」一個特定的名稱t並將其留給系統。 –

回答

0

在Oracle中,您可以使用CONSTRAINT contraint_name ...語法指定名稱,也可以不指定名稱,也可以將其忽略,Oracle會將約束命名爲SYS_C123456。命名自己做了很多更容易調試的代碼越來越像錯誤的約束:

ORA-02291: integrity constraint (TEST.SYS_C009329) violated - parent key not found 

不告訴你很多關於什麼列有幾件事你錯了 - 但是:

ORA-02291: integrity constraint (TEST.ROLES__INSTITUTE_ID__FK) violated - parent key not found 

告訴你確切地說,發生錯誤的表格和列(如果以足夠的細節命名您的約束)。

你可以看到這裏的約束名稱的區別:

甲骨文設置

CREATE TABLE students (id INT CONSTRAINT students__id__pk PRIMARY KEY); 
CREATE TABLE institutes(id INT CONSTRAINT institutes__id__pk PRIMARY KEY); 

CREATE TABLE roles(
    role_id  INT, 
    student_id INT, 
    institute_id INT, 
    ip   VARCHAR2(15), 
    CONSTRAINT roles__role_id__pk PRIMARY KEY(role_id), 
    CONSTRAINT roles__student_id__fk 
    FOREIGN KEY(student_id) REFERENCES students(id), 
    CONSTRAINT roles__institute_id__fk 
    FOREIGN KEY(institute_id) REFERENCES institutes(id), 
    CONSTRAINT roles__ip__u UNIQUE(ip) 
); 


CREATE TABLE roles1(
    role_id  INT, 
    student_id INT, 
    institute_id INT, 
    ip   VARCHAR2(15), 
    PRIMARY KEY(role_id), 
    FOREIGN KEY(student_id) REFERENCES students(id), 
    FOREIGN KEY(institute_id) REFERENCES institutes(id), 
    UNIQUE(ip) 
); 

查詢 - 命名約束

SELECT constraint_name, 
     constraint_type, 
     index_name, 
     r_constraint_name 
FROM USER_CONSTRAINTS 
WHERE table_name = 'ROLES'; 

輸出

CONSTRAINT_NAME    CONSTRAINT_TYPE INDEX_NAME      R_CONSTRAINT_NAME    
------------------------------ --------------- ------------------------------ ------------------------------ 
ROLES__ROLE_ID__PK    P    ROLES__ROLE_ID__PK            
ROLES__IP__U     U    ROLES__IP__U             
ROLES__STUDENT_ID__FK   R            STUDENTS__ID__PK    
ROLES__INSTITUTE_ID__FK  R            INSTITUTES__ID__PK    

查詢2 - 未命名約束

SELECT constraint_name, 
     constraint_type, 
     index_name, 
     r_constraint_name 
FROM USER_CONSTRAINTS 
WHERE table_name = 'ROLES1'; 

輸出

CONSTRAINT_NAME    CONSTRAINT_TYPE INDEX_NAME      R_CONSTRAINT_NAME    
------------------------------ --------------- ------------------------------ ------------------------------ 
SYS_C009326     P    SYS_C009326             
SYS_C009327     U    SYS_C009327             
SYS_C009328     R            STUDENTS__ID__PK    
SYS_C009329     R            INSTITUTES__ID__PK    

MySQL is similar but gives the constraints slightly better default names - but not by much.

0

除了第二個索引,其中外鍵引用不同的字段,4個約束是相同的。然而,即使在MySQL中,你可以按照類似的語法約束,看到create table MySQL文檔:

create_definition: 
    col_name column_definition 
    | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) 
     [index_option] ... 
    | {INDEX|KEY} [index_name] [index_type] (index_col_name,...) 
     [index_option] ... 
    | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] 
     [index_name] [index_type] (index_col_name,...) 
     [index_option] ... 
    | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...) 
     [index_option] ... 
    | [CONSTRAINT [symbol]] FOREIGN KEY 
     [index_name] (index_col_name,...) reference_definition 
    | CHECK (expr) 

此外,您可以使用Oracle與Apache和PHP,所以您不必更換甲骨文只是因爲預打包的安裝程序沒有默認配置oracle。

0

CONSTRAINT在Oracle中,關鍵字在MySQL和(如果內存服務)中是可選的。它的目的是允許您明確指定約束條件,這有助於提供自我文檔,並且在以後需要禁用約束或刪除或重建關聯索引時也很有用。