我有两个表与Staff成员表中的外键链接。我试图设置外键,以便如果没有来自Staff Member表的关联工作人员,则删除位置表中的一行。我正在使用ON DELETE CASCADE,但是即使仍然有与该职位相关联的职员,这也会删除该行。
Position Table
----------------------------------------------
----Attribute-------Type-------------Keys-----
----------------------------------------------
- Title -- VARCHAR(20) --Primary Key--
- MaxSalary -- DECIMAL(8,2) -- No -
- MinSalary -- DECIMAL(8,2) -- No -
----------------------------------------------
StaffMember Table
-----------------------------------------------------
----Attribute-------Type-----------------Keys--------
-----------------------------------------------------
- StaffNo -- INTEGER -- Primary Key --
- Name -- VARCHAR(20) -- No -
- Salary -- DECIMAL(8,2)-- No -
- StaffTitle -- VARCHAR(20) --FK Position(Title) -
-----------------------------------------------------
CREATE TABLE StaffMember(
StaffNo INTEGER PRIMARY KEY,
Name VARCHAR(20),
Salary DECIMAL(8,2),
StaffTitle VARCHAR(20) FOREIGN KEY REFERENCES Position(Title) ON DELETE CASCADE);
答案 0 :(得分:0)
如果我理解正确的话,你所做的与你想要的完全相反。
如果要使用单个ON DELETE CASCADE
命令删除主行和详细行,则使用 DELETE
,即删除主服务器将删除其所有详细信息。
你说你想阻止它发生。
所以 - 从约束语句中删除该选项,即
stafftitle varchar2(20) constraint fk_staff_position references position (title)
以下是一个例子:
SQL> create table position (title varchar2(20) primary key);
Table created.
SQL> create table staffmember
2 (staffno integer primary key,
3 name varchar2(20),
4 salary decimal (8, 2),
5 stafftitle varchar2(20) constraint fk_staff_pos references position (title)
6 );
Table created.
SQL> insert into position (title) values ('some title');
1 row created.
SQL> insert into staffmember (staffno, name, salary, stafftitle)
2 values (1, 'name', 100, 'some title');
1 row created.
SQL> delete from position;
delete from position
*
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.FK_STAFF_POS) violated - child record found
SQL>
请参阅?只要细节存在,就无法删除master。