.为啥被定义为参照表的表无法删除?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.为啥被定义为参照表的表无法删除?相关的知识,希望对你有一定的参考价值。

被定义为参照表的表无法删除是因为该表与其他表存在外键关系,如果删除该表会导致其他表的数据完整性受到影响。因此,在删除参照表之前必须先删除对其产生依赖的其他表的记录,或者取消这些表对参照表的外键关系。否则,删除参照表将会导致关联表中的数据无法正常查询和操作。 参考技术A 参照表的表无法被除的原因是,它们只是一种数据结构,而不是一种运算。参照表通常用于存储键/值对,比如字典、HashMap等,它们只能用于存储数据,而不能用于数学运算。
因此,参照表不能用于除法,因为除法是一种数学运算,而参照表不支持这种运算。要想实现除法,可以使用其他数据结构,比如数组或者链表,其中存储的元素支持数学运算。
参考技术B 参照表是指存储某个表中不可变的属性值的表,可以用于某些特定的表中的列或特定条件的参考标准。由于参照表的数据是不可变的,因此无法删除,如果删除参照表,将会导致与之关联的表出现错误。另外,参照表可以帮助确定两个表之间的关系,删除参照表将会破坏关系,从而影响数据的完整性和一致性。

完整性约束语法定义

语法说明:

[]表示可选,{|}表示选其中一个

外键:参照表的列名,外键中的所有列值在引用的列中必须全部存在,外键可以只引用主键和替代键(unique 约束的字段),不能引用被参照表中随机的一组列,被参照表中参照的列的值必须是唯一的。

父表名:外键所参照的表名,如:course为参照表,teacher表为被参照表或父表

父表列名:被参照表的列名。

On delete | update:可以为每个外键定义参照动作,参照动作包含两个部分,第一部分指定这个参照动作应用哪一条语句,有updatedelete,第二部分指定采取哪个动作,有restrictcascadeset nullno actionset default

Restrict:当要删除或更新父表中被参照列上在外键中出现的值时,拒绝对父表的删除或更新操作。

Cascade:当父表删除或更新行时,自动删除或更新子表中匹配的行。

Set null:当父表删除或更新行时,设置子表中与之对应的外键列为null,如果外键列没有指定not null关键字,就是合法的。

No action:不采取动作,但如果有一个相关的外键值在父表中,删除或更新该值将不被允许,此时和Restrict命令一样的功能。

Set default:作用和set null一样,但set default 是指定子表中外键值为默认值。

如果没有指定动作,deleteupdate默认使用restrict.

注意:外键参考约束只能用于InnoDB的存储引擎中。

创建外键的语法如下:

 如:FOREIGN KEY (ctno) REFERENCES teacher(tno))ctnocourse表的外键。一般来说外键为被参照表的主键,此处引用teacher表的tno

 1)在创建表时同时创建外键。如:

CREATE TABLE course (

cno CHAR(4) PRIMARY KEY NOT NULL,

cname VARCHAR(40) UNIQUE,

cperiod INT,

credit DECIMAL(3,1),

ctno CHAR(4) ,

CONSTRAINT fk_teacher_course FOREIGN KEY (ctno) REFERENCES teacher(tno)

On delete restrict);

2)如果表已经创建好,则用alter命令添加。如:

Alter table course add constraint fk_teaher_course foreign key (ctno) references teacher(tno) on delete restrict;

二、check完整性约束

语法格式:

Check(表达式);

表达式:指定需要检查的条件,在更新插入数据的时候,会检查数据是否满足条件。

如:学生信息表studentinfo中性别只有’男’和’女’.

1)创建表的时候指定check约束

Create table studentinfo(cno char(10),sex char(2) not null check (sex in (‘man’,’woman’));

2)如果表已经建立好,则用alter命令添加

Alter table studentinfo add   constraint ck_name check (sex in (‘man’,’woman’));

Check 完整性约束可以同时定义多个,中间用逗号分开。

目前mysql版本中,check完整性约束还未被强化,即mysql只会分析,但不会强制限制,相当于注释。

 

一、在上次建好的表中添加外键约束条件:

1,product表中catid列引用了category表中的catid,请为product表中catid列创建外键,保证当要删除category表中的catid列的值时,如果product表中catid列还有该值的记录时,拒绝对category表的删除操作

Alter table product add constraint fk_product_category foreign key (catid) references category(catid) on delete restrict;

 

 2.orders表中userid列引用了account表中的userid,请为orders表中userid列创建外键,保证当要删除和更新account表中的数据时,只要orders表中还有该客户的订单,就拒绝对account表进行删除和更新操作。

Alter table orders add constraint fk_orders_account foreign key(userid) references account(userid) on delete restrict on update restrict;

 

3.lineitem表中itemid列引用了product表中的productid,请为lineitem表中itemid列创建外键,保证当要删除和更新product表中的商品编号时,自动删除或更新lineitem表中匹配的行。

Alter table lineitem add constraint fk_lineitem_product foreign key (itemid) references product(productid) on delete Cascade;

 

 4,lineitem表中orderid列引用了orders表中的orderid,请为lineitem表中orderid列创建外键,以保证当要删除orderid表中的订单编号时,自动删除lineitem表中匹配的行。

 Alter table lineitem add constraint fk_lineitem_orders foreign key (orderid) references orders(orderid) on delete Cascade;

 

 5,account表中sex列添加check约束

Alter table account add constraint ck_name  check (sex in (‘man’,’woman’));

 

 

二、为订单表orders中的orderdate字段建立索引。

建立索引:create index  aaa  on orders(orderdate);

查看show index from orders;

查询结果中table为表名,key_name为索引名,Column_name为列名

 

以上是关于.为啥被定义为参照表的表无法删除?的主要内容,如果未能解决你的问题,请参考以下文章

为啥数据库中的表不能修改保存

sql server解决无法删除修改拥有外键约束的表或表的记录字段

为啥突然表单就提交失败了

无法通过 C# 中的 OleDB 从 Microsoft Access 中删除表的所有行

为啥不可以使用delete from---语句删除数据量比较大的表(百万级)中的数据?

完整性约束语法定义