当前位置: 首页 > 编程笔记 >

如何在Oracle中使用主键约束和外键约束来增强数据库完整性?

劳鹏云
2023-03-14
本文向大家介绍如何在Oracle中使用主键约束和外键约束来增强数据库完整性?,包括了如何在Oracle中使用主键约束和外键约束来增强数据库完整性?的使用技巧和注意事项,需要的朋友参考一下

问题:

您要使用主键约束和外键约束来强制Oracle中的数据库完整性。

在以完整性定义的表上执行的任何DML语句(INSERT,UPDATE或DELETE)都有助于确保表中的行保持其完整性。

让我们看一些显示主键约束的实施的示例。customer表的主键是customer_id列,这意味着存储在customer_id列中的每个值都必须是唯一的。如果尝试插入具有重复值的行作为主键,则数据库将返回错误ORA-00001,如以下示例所示。

示例

INSERT INTO customers (customer_id, first_name, last_name, dob, phone) VALUES (1, 'Roger', 'Federer', '01-JAN-83', '001-001-0001');

INSERT INTO customers (
*
ERROR at line 1:
ORA-00001: unique constraint (STORE.CUSTOMERS_PK) violated

如果您尝试将主键值更新为表中已经存在的值,则数据库将返回相同的错误。

示例

UPDATE customers
   SET customer_id = 1
 WHERE customer_id = 2;
 
ERROR at line 1:
ORA-00001: unique constraint (STORE.CUSTOMERS_PK) violated

外键关系是其中一个表中的列在另一表中被引用的关系。例如,products表中的product_type_id列引用product_types表中的product_type_id列。product_types表称为父表,products表称为子表,反映了product表中product_type_id列对product_types表中product_type_id列的依赖性。

如果您尝试将不存在product_type_id的行插入到products表中,则数据库将返回错误ORA-02291。此错误表明数据库找不到匹配的父键值。

示例

INSERT INTO products (product_id, product_type_id, name, description, price) VALUES (999, 999, 'Test product', 'Test Product', 23);
INSERT INTO products (
*
ERROR at line 1:
ORA-02291: integrity constraint (STORE.PRODUCTS_FK_PRODUCT_TYPES)
 violated - parent key not found

如果您尝试将产品表中一行的product_type_id更新为不存在的父键值,则数据库将返回相同的错误。

示例

UPDATE products
   SET product_type_id = 999
 WHERE product_id = 999;
 
UPDATE products
*
ERROR at line 1:
ORA-02291: integrity constraint (STORE.PRODUCTS_FK_PRODUCT_TYPES)
 violated - parent key not found

最后,如果您尝试删除父表中具有相关子行的行,则数据库将返回错误ORA-02292。例如,如果您尝试从product_types表中删除product_type_id为1的行,则数据库将返回此错误,因为products表包含product_type_id为1的行。

示例

 DELETE FROM product_types
  WHERE product_type_id = 1;

DELETE FROM product_types
*
ERROR at line 1:
ORA-02292: integrity constraint (STORE.PRODUCTS_FK_PRODUCT_TYPES)
 violated - child record found

表定义用于以上问题。

示例

--------------create scripts----------------------------
create table customers (
   customer_id     integer generated by default on null as identity,
   email_address   varchar2(255 char) not null,
   full_name       varchar2(255 char) not null)
 ;
 
create table stores (
   store_id          integer generated by default on null as identity ,
   store_name        varchar2(255 char) not null,
   web_address       varchar2(100 char),
   physical_address  varchar2(512 char),
   latitude          number,
   longitude         number,
   logo              blob,
   logo_mime_type    varchar2(512 char),
   logo_filename     varchar2(512 char),
   logo_charset      varchar2(512 char),
   logo_last_updated date)
 ;
 
create table products (
   product_id         integer generated by default on null as identity ,
   product_name       varchar2(255 char) not null,
   unit_price         number(10,2),
   product_details    blob,
   product_image      blob,
   image_mime_type    varchar2(512 char),
   image_filename     varchar2(512 char),
   image_charset      varchar2(512 char),
   image_last_updated date)
 ;
 
 
--------------------------constraints--------------------------------------
 
alter table customers add constraint customers_pk primary key (customer_id);

alter table customers add constraint customers_email_u unique (email_address);

alter table stores add constraint stores_pk primary key (store_id);

alter table stores add constraint store_name_u unique (store_name);

alter table stores add constraint store_at_least_one_address_c
  check (
    web_address is not null or physical_address is not null
  );

alter table products add constraint products_pk primary key (product_id);

alter table products add constraint products_json_c
                     check ( product_details is json );
 类似资料:
  • mysql 5.7 外键约束 主表:部门表 从表:员工表 添加外键:从表 dep_id 关联 主表 id >[danger] CASCADE > 级联更新 主表数据更新从表会更新外键 级联删除 主表数据删除,从表会一起删除

  • 主要内容:在创建表时设置外键约束,在修改表时添加外键约束,删除外键约束MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。 外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西

  • 注意 当前章节中涉及的配置一般适用于关系数据库。这里展示的扩展方法在你安装了关系数据库提供程序之后就能获得(由Microsoft.EntityFrmeworkCore.Relational 程序包共享)。 外键约束是为模型中的关系引入的。 惯例 按照惯例,外键约束命名为 FK_<依赖实体类型名称>_<主实体类型名称>_<外键属性名称>。对于组合键,<外键属性名> 则为用下划线分隔的外键属性名。 数

  • 我有个任务我必须 创建特定情况的实体关系图,然后 编写SQL代码来表示图表 我不熟悉SQL Server,但我有一个表,它有一个主键和两个外键,与讲师有一个强制关系,与

  • 问题内容: 在事务SQL中,如何指定外键约束应为1:1关系?声明列UNIQUE是否足够?下面是我现有的代码。 问题答案: 具有UNIQUE和NOT NULL约束的外键列在另一个表中引用UNIQUE,NOT NULL列会创建1:(0 | 1)关系,这可能就是您想要的。 如果存在真正的1:1关系,则第一个表中的每个记录在第二个表中都会有一个对应的记录,反之亦然。在这种情况下,您可能只想制作一张表(除非

  • 我定义了一个外键。为了检查它,我在具有外键的表中插入了错误的值。未打印任何错误,值已成功添加。我不知道我是否正在运行一些旧版本的sqlite3或类似的东西,我对这个领域是完全陌生的。 创建表ref(value 1 int, value 2,主键(value 1)); 为(value1 int、value3 int、主键(value3)、外键(value1)引用ref(value1))创建表; 插入