在下表中输入值时,如何在 SQL 中对同一表的列强制执行外键约束:
员工:
- 空号,
- 经理编号(必须是现有员工)
在下表中输入值时,如何在 SQL 中对同一表的列强制执行外键约束:
员工:
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 链接。
如果您无法更改表格,那么您应该按照重要性降序排列。
自引用查询...
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;
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
希望能帮助到你!