如何在SQL中同一表的列上强制执行外键约束,同时在下表中输入值:
雇员:
发布于 2012-01-07 07:44:22
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-07 10:39:50
Oracle将此称为自引用完整性约束。文档是这里来描述的,
创建自引用约束的方式与正常约束的方式相同:
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,如下所示。
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的链接。
如果您无法更改表,那么您应该按重要性的降序排列。
发布于 2013-08-13 16:54:57
自我引用查询..。
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;
https://stackoverflow.com/questions/8768118
复制相似问题