.为啥被定义为参照表的表无法删除?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.为啥被定义为参照表的表无法删除?相关的知识,希望对你有一定的参考价值。
被定义为参照表的表无法删除是因为该表与其他表存在外键关系,如果删除该表会导致其他表的数据完整性受到影响。因此,在删除参照表之前必须先删除对其产生依赖的其他表的记录,或者取消这些表对参照表的外键关系。否则,删除参照表将会导致关联表中的数据无法正常查询和操作。 参考技术A 参照表的表无法被除的原因是,它们只是一种数据结构,而不是一种运算。参照表通常用于存储键/值对,比如字典、HashMap等,它们只能用于存储数据,而不能用于数学运算。因此,参照表不能用于除法,因为除法是一种数学运算,而参照表不支持这种运算。要想实现除法,可以使用其他数据结构,比如数组或者链表,其中存储的元素支持数学运算。 参考技术B 参照表是指存储某个表中不可变的属性值的表,可以用于某些特定的表中的列或特定条件的参考标准。由于参照表的数据是不可变的,因此无法删除,如果删除参照表,将会导致与之关联的表出现错误。另外,参照表可以帮助确定两个表之间的关系,删除参照表将会破坏关系,从而影响数据的完整性和一致性。
完整性约束语法定义
语法说明:
[]表示可选,{|}表示选其中一个
外键:参照表的列名,外键中的所有列值在引用的列中必须全部存在,外键可以只引用主键和替代键(unique 约束的字段),不能引用被参照表中随机的一组列,被参照表中参照的列的值必须是唯一的。
父表名:外键所参照的表名,如:course为参照表,teacher表为被参照表或父表。
父表列名:被参照表的列名。
On delete | update:可以为每个外键定义参照动作,参照动作包含两个部分,第一部分指定这个参照动作应用哪一条语句,有update和delete,第二部分指定采取哪个动作,有restrict、cascade、set null、 no action和set default。
Restrict:当要删除或更新父表中被参照列上在外键中出现的值时,拒绝对父表的删除或更新操作。
Cascade:当父表删除或更新行时,自动删除或更新子表中匹配的行。
Set null:当父表删除或更新行时,设置子表中与之对应的外键列为null,如果外键列没有指定not null关键字,就是合法的。
No action:不采取动作,但如果有一个相关的外键值在父表中,删除或更新该值将不被允许,此时和Restrict命令一样的功能。
Set default:作用和set null一样,但set default 是指定子表中外键值为默认值。
如果没有指定动作,delete和update默认使用restrict.
注意:外键参考约束只能用于InnoDB的存储引擎中。
创建外键的语法如下:
如:FOREIGN KEY (ctno) REFERENCES teacher(tno));ctno为course表的外键。一般来说外键为被参照表的主键,此处引用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 中删除表的所有行