我的数据库是oracle 10.2,我的建表sql是这样的:
create table T_EP_SYS_COMPANY
(
company_id NUMBER not null,
company_name VARCHAR2(30),
company_address VARCHAR2(100),
is_in_use VARCHAR2(1),
is_canceled VARCHAR2(1),
is_headquarter VARCHAR2(1),
account_id NUMBER not null
)
tablespace USERS
pctfree 10
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
alter table T_EP_SYS_COMPANY
add constraint PK_ESHOP_SYS_COMPANY primary key (COMPANY_ID)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
alter table T_EP_SYS_COMPANY
add constraint FK_SYS_COMPANY_PAY_ACCOUNT foreign key (ACCOUNT_ID)
references T_EP_PAY_ACCOUNT (ACCOUNT_ID);
但是在我的数据库中,我必须在“account_id”列上有 2 个 FK:
owner constraint_name table_name column_name position
ESHOPV2 SYS_C009725 T_EP_SYS_COMPANY ACCOUNT_ID null
ESHOPV2 FK_SYS_COMPANY_PAY_ACCOUNT T_EP_SYS_COMPANY ACCOUNT_ID 1
为什么有2个FK?我确实重命名了表名,重命名ddl是否与此有关?
最佳答案
它们并不都是外键约束。 The SYS_C is a system-generated name for a constraint you didn't explicitly name ;在这种情况下,您的非空检查。您可以在创建后立即看到这些:
create table T_EP_SYS_COMPANY
(
company_id NUMBER not null,
company_name VARCHAR2(30),
company_address VARCHAR2(100),
is_in_use VARCHAR2(1),
is_canceled VARCHAR2(1),
is_headquarter VARCHAR2(1),
account_id NUMBER not null
);
select uc.constraint_name, uc.constraint_type, ucc.column_name, ucc.position
from user_constraints uc
join user_cons_columns ucc on ucc.constraint_name = uc.constraint_name
where uc.table_name = 'T_EP_SYS_COMPANY';
CONSTRAINT_NAME CONSTRAINT_TYPE COLUMN_NAME POSITION
------------------------------ --------------- --------------- --------
SYS_C0093988 C COMPANY_ID
SYS_C0093989 C ACCOUNT_ID
约束类型为C,表明它是一个检查约束。您可以通过显式添加检查约束来命名它们,而不是将它们指定为“not null”,但没有真正的好处 - 您不需要按名称引用它们,例如暂时禁用它们。
添加主键和外键后,您也会看到它们:
alter table T_EP_SYS_COMPANY
add constraint PK_ESHOP_SYS_COMPANY primary key (COMPANY_ID);
alter table T_EP_SYS_COMPANY
add constraint FK_SYS_COMPANY_PAY_ACCOUNT foreign key (ACCOUNT_ID)
references T_EP_PAY_ACCOUNT (ACCOUNT_ID);
select uc.constraint_name, uc.constraint_type, ucc.column_name, ucc.position
from user_constraints uc
join user_cons_columns ucc on ucc.constraint_name = uc.constraint_name
where uc.table_name = 'T_EP_SYS_COMPANY';
CONSTRAINT_NAME CONSTRAINT_TYPE COLUMN_NAME POSITION
------------------------------ --------------- --------------- --------
SYS_C0093988 C COMPANY_ID
SYS_C0093989 C ACCOUNT_ID
PK_ESHOP_SYS_COMPANY P COMPANY_ID 1
FK_SYS_COMPANY_PAY_ACCOUNT R ACCOUNT_ID 1
它们具有约束类型 P 和 R,用于“主键”和“引用完整性”。
了解更多关于types of integrity constraints的信息和 how they are shown in the data dictionary .
关于oracle - oracle 外键约束名称 SYS_C 来自哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28849465/