在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.
第一組給出的約束第二個沒有按」一個特定的名稱t並將其留給系統。 –