SQL> desc person
名称 是否为空? 类型
----------------------------------------- -------- ------------------------
PERSONID NOT NULL NUMBER(9)
PROFESSION NUMBER(2)
IDORPASSPORTNO VARCHAR2(18)
INSURANCE VARCHAR2(32)
FIRSTNAME VARCHAR2(32)
LASTNAME VARCHAR2(32)
CHINESENAME VARCHAR2(64)
SEX CHAR(1)
BIRTHDAY DATE
USERTYPE VARCHAR2(2)
SEARCHCODE CHAR(10)
ORGID NUMBER(9)
ADDRESSID NUMBER(9)
SQL> desc PERSONPROFESSION
名称 是否为空? 类型
----------------------------------------- -------- ------------------------
PROFESSIONID NOT NULL NUMBER(2)
NAME VARCHAR2(32)
ALIAS VARCHAR2(32)
INITCREDIT NUMBER(3)
MEMO VARCHAR2(200)
假定PERSONPROFESSION为父表,PERSON为子表,建立如下约束条件:
SQL>ALTER TABLE PERSONPROFESSION ADD (CONSTRAINT PK_PERSONPROFESSION PRIMARY KEY (PROFESSIONID) USING INDEX TABLESPACE WACOS;
表已更改。
SQL>ALTER TABLE PERSON ADD (CONSTRAINT PK_PERSON PRIMARY KEY (PERSONID) USING INDEX TABLESPACE WACOS;
表已更改。
增加PERSON表的外键约束:
SQL>ALTER TABLE PERSON ADD (CONSTRAINT FK_PERSON1 FOREIGN KEY (PROFESSION)
REFERENCES PERSONPROFESSION (PROFESSIONID) );
表已更改。
分别向两张表里插入一行数据:
SQL>insert into PERSONPROFESSION values('1','sdfd','df','342','dfs');
已创建 1 行。
SQL> commit;
提交完成。
SQL>insert into person values('10','1','dsf','d','d','df','df','0','','sd','s','11','11');
已创建 1 行。
SQL> commit;
SQL> select PERSONID,PROFESSION from person;
PERSONID PROFESSION
---------- ----------
10 1
SQL> select PROFESSIONID,name from PERSONPROFESSION;
PROFESSIONID NAME
------------ --------------------------------
1 sdfd
SQL> delete from PERSONPROFESSION;
delete from PERSONPROFESSION
*
ERROR 位于第 1 行:
ORA-02292: 违反完整约束条件 (WACOS.FK_PERSON1) - 已找到子记录日志.
报错是因为父表里存在子表的记录,应先删除子表记录,再删除父表记录:
SQL> delete from PERSON;
已删除 1 行。
SQL> delete from PERSONPROFESSION;
已删除 1 行。
SQL> commit;
提交完成。
那么,如何实现两张表的级连删除呢?
重新建立PERSON的外键,加上ON DELETE CASCADE选项试一下:
SQL> alter table person drop CONSTRAINT FK_PERSON1;
表已更改。
SQL>ALTER TABLE PERSON ADD (CONSTRAINT FK_PERSON1 FOREIGN KEY (PROFESSION)
REFERENCES PERSONPROFESSION (PROFESSIONID) ON DELETE CASCADE);
表已更改。
增加外键约束的时候加ON DELETE CASCADE选项目的是可以在子表记录存在的情况下直接删除父表记录,而不用受约束的限制:
SQL> delete from PERSONPROFESSION;
已删除 1 行。
SQL> select PERSONID,PROFESSION from person;
PERSONID PROFESSION
---------- ----------
10 1
SQL> select * from PERSONPROFESSION;
未选定行
以上可以看出父表记录删除了,子表记录还存在。
那么在delete语句的末尾加上CASCADE,就可以实现两张表的级删除:
SQL> delete from PERSONPROFESSION cascade;
已删除 1 行。
SQL> select * from person;
未选定行
SQL> select * from PERSONPROFESSION;
未选定行
以下是ON DELETE的官方解释:
ON DELETE
The ON DELETE clause indicates that when a DELETE is executed on a referenced row in the referenced table, one of the following actions will be executed upon the constrained column, as specified by action:
NO ACTION(default)
The NO ACTION clause produces an error if the reference is violated. This is the default if action is not specified.
CASCADE
The CASCADE keyword removes all rows which reference the deleted row. Exercise caution with this action.
SET NULL
The SET NULL clause assigns a NULL value to all referenced column values
相关推荐
`on_delete=SET(lambda x: None)`或类似用法允许你指定一个函数或表达式,该函数或表达式会在删除操作发生时执行,以确定外键的新值。这可以用来设置一个特定的替代值,而不是简单的`None`或默认值。 在Django中,...
例如,当一个department被删除时,所有引用它的记录(如course和instructor表)的dept_name将被设为NULL(on delete set null),或记录将被级联删除(on delete cascade)。 4. **数据库设计原则**: 这个数据库...
默认情况下,`on_delete` 设置为 `models.CASCADE`,意味着如果父记录被删除,所有依赖它的子记录也将被删除,这是一种级联删除操作。然而,根据业务需求,可能需要避免这种行为。例如: 1. `models.PROTECT`:阻止...
CONSTRAINT fk_name FOREIGN KEY (foreign_key_column) REFERENCES main_table (referenced_column) ON UPDATE CASCADE ON DELETE CASCADE ``` #### 五、数据库设计中的三大范式 为了保证数据库的结构合理化,...
- **示例**:`ON DELETE CASCADE`表示当主表中的记录被删除时,从表中相应的记录也会被删除。 7. **默认值**: - **定义**:使用DEFAULT关键字为列设置默认值。 - **作用**:简化数据录入过程。 - **创建方法**...
例如,在permission_role表中,permission_id和role_id分别引用了permissions表和roles表中的id字段,并设置级联删除(onDelete('cascade')),以确保当删除角色或权限时,相关的中间表中的记录也会被删除。...
- **级联删除**: `ON DELETE CASCADE` - 示例:`ALTER TABLE orders ADD CONSTRAINT fk_orders_customer_id FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE;` - **说明**:当主...
常见的选项有CASCADE(级联删除)、PROTECT(保护,阻止删除)、SET_NULL(设为NULL,如果允许NULL的话)等。 - `db_constraint`则控制是否在数据库中创建外键约束。默认情况下,Django会在数据库中创建外键约束,但...
user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE')) user = relationship("User", back_populates="addresses", cascade="all, delete-orphan") ``` #### 2.15 构建多对多关系 - 定义多对...