2016-03-26 4 views
0

В чем разница между синтаксисом:использовать или не использовать CONSTRAINT

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, 

я использовал первый набор кода при написании создания заявления в разработчике SQL оракула , к сожалению, мне нужно преобразовать код оракула в 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 

говорит вам точно стол и столбец, где произошла ошибка (если вы назовете свои ограничения достаточно подробно).

Вы можете увидеть разницу в названиях ограничений здесь:

Настройка Oracle:

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

Помимо 2-го индекса, где внешние ключи ссылаются на разные поля, 4 ограничения одинаковы. Тем не менее, даже в MySQL вы можете следовать ограничению подобного синтаксису, см MySQL документации на create table:

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) 

Кроме того, вы можете использовать оракул с Apache и PHP, так что вам не придется заменить оракул только потому, что пред- пакетный установщик не имеет оракула, настроенного по умолчанию.

0

Ключевое слово CONSTRAINT необязательно в MySQL и (если память используется) в Oracle. Его цель - дать вам возможность явно указывать ограничение, которое помогает обеспечить самостоятельную документацию, а также полезно, если впоследствии вам нужно отключить ограничение или удалить или перестроить связанный индекс.

Смежные вопросы