2012-01-07 82 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;