強制外鍵約束同桌
回答
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. 外鍵約束上的兩列referncing一個同桌
- 8. 鍵入數據集 - 強制約束
- 9. CakePHP&外鍵約束
- 10. SQL約束:外鍵
- 11. MySQL外鍵約束
- 12. 與外鍵約束
- 13. 與外鍵約束
- 14. 從外鍵約束
- 15. 外鍵約束 - Pentaho
- 16. SqlAlchemy外鍵約束
- 17. mysql外鍵約束
- 18. Netezza外鍵約束
- 19. 外鍵約束5
- 20. 外鍵約束SQL
- 21. SQLite外鍵約束
- 22. Sql外鍵約束
- 23. SQL Server 2005,強制實施外鍵約束和級聯刪除
- 24. 刪除複製表的外鍵約束
- 25. 添加外鍵外鍵約束表
- 26. innodb和外鍵 - 外鍵約束失敗
- 27. Neo4J:強制關係約束
- 28. 種子外鍵約束
- 29. Laravel改變外鍵約束
- 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