2012-01-07 61 views
9

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

员工

  • EMPID数,
  • 管理者编号(必须是现有雇员)

回答

-2
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 

希望它有帮助!

+0

有点...!任何其他方法/建议的甲骨文? – 2012-01-07 08:15:26

+0

我从来没有尝试过,但我认为给TABLE_NAME,而不是“parent_table_name”应该工作! – instanceOfObject 2012-01-07 08:22:02

+3

这不是我为MySql建议的Oracle – 2012-01-07 10:40:44

20

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可为空。我在这里添加了null,因为delete cascade可能会消除大量的表格。

我想不出一个更好的方法来做到这一点。删除经理不应导致他们所有员工的删除,因此您必须登录set null并在桌面上添加一个触发器,以提醒您任何没有经理的人。

我总是喜欢this网站,这对于简单的参考很有用。不要忘了在FK上也有索引,否则Tom会对你大喊:-)。

也可以使用标准的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可能不是一种方法。也许有一张经理人表和一张雇员表?
+0

这可能是一个解决方案,但在我的情况下,没有'触发',不允许'改变'。只需要简单的“创建表”,然后是“插入”。现在? – 2012-01-07 14:36:17

+0

@popstack,我有太多话要说,所以我在答案中加了一个编辑。 – Ben 2012-01-07 15:14:12

+0

很确定你将不得不为外键约束定义一个唯一或外键约束来引用。你可以总是省略'ON DELETE'子句,其功能与其他RDBMS中的ON DELETE RESTRICT子句一样,防止删除具有子记录的父项。 – 2012-01-09 00:14:43

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; 

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