oracle - oracle 外键约束名称 SYS_C 来自哪里

标签 oracle foreign-keys

我的数据库是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/

相关文章:

SQL如何在LIKE命令中传递sysdate?

sql - 识别 NULL 并分配位图

oracle - 运行pl/sql的目标列表中不存在程序?

java - SQL trunc/group/order by dates (day/month/quarter/year) with sum skip dates with no data

c# - 将数据插入到与外键链接的表中

没有显式外键关系的 Linq To SQL

java - SQL聚合函数如何工作

templates - EF4 : Get the linked column names from NavigationProperty of an EDMX

database - 我应该创建一个可以为空的外键还是创建一个新表?

mysql - 日期时间mysql默认值、索引和主键