首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对同一表的列强制执行外键约束。

对同一表的列强制执行外键约束。
EN

Stack Overflow用户
提问于 2012-01-07 07:29:56
回答 3查看 29.8K关注 0票数 12

如何在SQL中同一表的列上强制执行外键约束,同时在下表中输入值:

雇员

  • 空号,
  • 经理号码(必须是现有员工)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-07 07:44:22

代码语言:javascript
复制
CREATE TABLE TABLE_NAME (
    `empid_number`    int     (  11) NOT NULL auto_increment,   
    `employee`        varchar ( 100) NOT NULL               ,
    `manager_number`  int     (  11) NOT NULL               ,
     PRIMARY KEY  (`empid_number`),
     CONSTRAINT `manager_references_employee`
     FOREIGN KEY (`manager_number`) REFERENCES (`empid_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

希望能帮上忙!

票数 -1
EN

Stack Overflow用户

发布于 2012-01-07 10:39:50

Oracle将此称为自引用完整性约束。文档是这里来描述的,

创建自引用约束的方式与正常约束的方式相同:

代码语言:javascript
复制
alter table employees
  add constraint employees_emp_man_fk
      foreign key ( manager_no )
      references employees ( emp_id )
   on delete set null
      ;

我假设您的manager_no是可空的。我在这里添加了set null,因为delete cascade可能会删除大量的表。

我想不出比这更好的方法了。删除经理不应导致删除其所有员工,因此您必须使用set null并在表上设置触发器,以便向没有经理的任何人发出警告。

我总是喜欢站点,这对于简单的参考是很好的。别忘了在FK上也有一个索引,否则汤姆会对你大喊大叫的。

还可以使用标准Oracle语法在create语句中创建自引用FK,如下所示。

代码语言:javascript
复制
create table employees
 ( emp_id number
 , other_columns ...
 , manager_no number
 , constraint employees_pk 
    primary key (emp_id)
 , constraint employees_man_emp_fk
    foreign key ( manager_no )
    references employees ( emp_id )
    on delete set null
 );

编辑:

以下是对@pop堆栈的评论的答复:

虽然你可以在一个声明中做到这一点,但不能改变一张桌子是一种相当荒谬的状态。您肯定应该分析要从中选择的表,并且仍然需要外键上的索引(可能还有更多的列和/或更多的索引),否则,无论何时使用外键,都要进行完整的表扫描。请参阅上面到asktom的链接。

如果您无法更改表,那么您应该按重要性的降序排列。

  1. 找出你能做什么。
  2. 将您的DB设计更改为FK应该有一个索引,如果您不能拥有一个索引,那么FKs可能并不是可行的方法。也许有一张经理表和一张员工表?
票数 23
EN

Stack Overflow用户

发布于 2013-08-13 16:54:57

自我引用查询..。

代码语言:javascript
复制
Alter table table_name ADD constraints constraints_name foreign key(column_name1,column_name2..) references table_name(column_name1,column_name2...) ON DELETE CASCADE;

ALTER TABLE Employee ADD CONSTRAINTS Fr_key( mgr_no) references employee(Emp_no) ON DELETE CASCADE;

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8768118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档