SQL语句(八)参照完整性

1.参照完整性

      参照完整性主要是定义外码,将一个关系的主码放在另一个关系中,作为该关系的属性,就称其为外码。外码的取值有两种情况,一种为空,另外一种就是被参照表的主码的域。

2.实例

1.创建表时定义参照完整性
①先定义nation3的实体完整性,再定义supplier3在nation3上的列级参照完整性
CREATE TABLE nation3(/*国家表*/
  nationkey INTEGER PRIMARY KEY,           /*国家编号*/
  name CHAR(25),                           /*国家名称*/
  regionkey INTEGER,                       /*地区编号*/
  comment VARCHAR(152)                     /*备注*/
);

CREATE TABLE supplier3(/*供应商基本表*/
   suppkey INTEGER PRIMARY KEY,            /*供应商编号*/
   name CHAR(50),                          /*供应商名称*/
   address VARCHAR(80),                    /*供应商地址*/
   nation INTEGER REFERENCES nation3(nationkey),/*国家编号*/
   phone CHAR(30),                          /*供应商电话*/
   acctbal REAl,
   comment VARCHAR(101)                     /*备注*/
);
②先定义nation3的实体完整性,再定义supplier4在nation3上的表级参照完整性
CREATE TABLE supplier4(/*供应商基本表*/
   suppkey INTEGER PRIMARY KEY,            /*供应商编号*/
   name CHAR(50),                          /*供应商名称*/
   address VARCHAR(80),                    /*供应商地址*/
   nation INTEGER,                          /*国家编号*/
   phone CHAR(30),                          /*供应商电话*/
   acctbal REAl,
   comment VARCHAR(101),                     /*备注*/
   CONSTRAINT nation_3 FOREIGN KEY(nation)REFERENCES nation3(nationkey)
);
2.创建表后定义参照完整性
CREATE TABLE nation4(/*国家表*/
  nationkey INTEGER PRIMARY KEY,           /*国家编号*/
  name CHAR(25),                           /*国家名称*/
  regionkey INTEGER,                       /*地区编号*/
  comment VARCHAR(152)                     /*备注*/
);
ALTER TABLE nation4
ADD CONSTRAINT regionkey_4
FOREIGN KEY(regionkey)REFERENCES region(regionkey);
3.外码由多个属性组成时定义参照完整性
CREATE TABLE partsupp3(/*零件供应联系表*/
  partkey INTEGER,/*零件编号*/
  suppkey INTEGER,/*供应商编号*/
  availqty INTEGER,/*可用数量*/
  supplycost REAL,/*供应价格*/
  comment VARCHAR(199),/*备注*/
  PRIMARY KEY(partkey,suppkey),/*定义主码*/
  FOREIGN KEY(partkey)REFERENCES part(partkey),
  FOREIGN KEY(suppkey)REFERENCES supplier(suppkey)
  );
4.定义参照完整性的违约处理
 CREATE TABLE customer3(/*顾客表*/
  custkey INTEGER PRIMARY KEY,/*顾客编号*/
  name VARCHAR(25),/*姓名*/
  address VARCHAR(40),/*地址*/
  nationkey INTEGER,/*国籍编号*/
  phong CHAR(15),/*电话*/
  acctbal CHAR(10),/*账户余额*/
  mktsegment CHAR(10),/*市场分区*/
  comment VARCHAR(117),/*备注*/
  CONSTRAINT nationkey_3 FOREIGN KEY(nationkey)REFERENCES nation(nationkey)
  ON DELETE CASCADE
  ON UPDATE SET NULL
 );
5.删除参照完整性
ALTER TABLE nation4
DROP CONSTRAINT regionkey_4;
6.插入一条记录,验证参照完整性是否起到作用
SELECT *
FROM nation3;
INSERT
INTO supplier3
VALUES(1,'liuhui','天津北辰',40,'18713978292',1,'vip');

3.说明

       在实例内容6中,插入到supplier3中的nationkey 40在nation3中并不存在,因此插入时违反了参照完整性。关于参照完整性的违约处理,一般情况下对参照表和被参照表的操作违反了参照完整性时,系统选择默认的策略,即拒绝执行,如果想让系统采用其他的策略则必须在创建表格时显示地加以说明。

猜你喜欢

转载自blog.csdn.net/shujian_tianya/article/details/81130425
今日推荐