10

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

员工

  • 空号,
  • 经理编号(必须是现有员工)
4

3 回答 3

21

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

您以与普通约束相同的方式创建自引用约束:

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 table 语句中创建自引用 FK,如下所示。

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
 );

编辑:

回答下面@popstack 的评论:

虽然您可以在一个语句中执行此操作,但无法更改表是一种相当荒谬的情况。您绝对应该分析您将要从中选择的表,并且您仍然需要外键上的索引(可能还有更多列和/或更多索引),否则每当您使用外键时,您都会这样做全表扫描。请参阅我上面的 asktom 链接。

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

  1. 找出你怎么做。
  2. 改变你的数据库设计,因为 FK 应该有一个索引,如果你不能有一个索引,那么 FK 可能不是要走的路。也许有一张经理表和一张员工表?
于 2012-01-07T10:39:50.690 回答
1

自引用查询...

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;

于 2013-08-13T16:54:57.053 回答
-1
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

希望能帮助到你!

于 2012-01-07T07:44:22.827 回答