强制外键约束同桌
回答
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
希望它有帮助!
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。
如果您无法更改表格,那么您应该按重要性降序排列。
- 了解如何才能。
- 更改你的数据库设计,因为FK应该有一个索引,如果你不能拥有一个,那么FK可能不是一种方法。也许有一张经理人表和一张雇员表?
这可能是一个解决方案,但在我的情况下,没有'触发',不允许'改变'。只需要简单的“创建表”,然后是“插入”。现在? – 2012-01-07 14:36:17
@popstack,我有太多话要说,所以我在答案中加了一个编辑。 – Ben 2012-01-07 15:14:12
很确定你将不得不为外键约束定义一个唯一或外键约束来引用。你可以总是省略'ON DELETE'子句,其功能与其他RDBMS中的ON DELETE RESTRICT子句一样,防止删除具有子记录的父项。 – 2012-01-09 00:14:43
自引用查询...
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;
- 1. 强制闭环外键约束
- 2. 外键约束
- 3. 外键约束
- 4. 外键约束
- 5. 键入数据集 - 强制约束
- 6. 从外键约束
- 7. 外键约束 - Pentaho
- 8. SqlAlchemy外键约束
- 9. 与外键约束
- 10. SQLite外键约束
- 11. mysql外键约束
- 12. 外键约束SQL
- 13. SQL Server 2005,强制实施外键约束和级联删除
- 14. 删除复制表的外键约束
- 15. 添加外键外键约束表
- 16. Neo4J:强制关系约束
- 17. 添加外键约束
- 18. 外键约束(复杂?)
- 19. 数据库外键约束
- 20. Derby中的外键约束
- 21. MySql外键约束问题
- 22. 外键约束问题
- 23. 外键约束失败
- 24. 流利Nhibernate外键约束
- 25. 外键约束在Oracle
- 26. MERGE冲突外键约束
- 27. MySQL - 外键约束错误
- 28. SQLite - 外键约束 - IO 5
- 29. 检查外键约束MySQL
- 30. 多列外键约束上
有点...!任何其他方法/建议的甲骨文? – 2012-01-07 08:15:26
我从来没有尝试过,但我认为给TABLE_NAME,而不是“parent_table_name”应该工作! – instanceOfObject 2012-01-07 08:22:02
这不是我为MySql建议的Oracle – 2012-01-07 10:40:44