В 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.
Первый набор дает ограничения определенное имя второй Безразлично» t и оставляет его в системе. –