创建主、外键约束(列级别和表级别)

创建主键约束

代码  在属性中使用CONSTRAINT关键字

 
 
  1. CREATE TABLE invoice  
  2. (  
  3.    invoice_id NUMBER CONSTRAINT invoice_pk PRIMARY KEY,  
  4.                                                 --自动编号,唯一,不为空   
  5.    vendor_id NUMBER CONSTRAINT vendor_id_nn NOT NULL,   --供应商ID  
  6.    invoice_number VARCHAR2(50) CONSTRAINT vendor_number_nn   NOT NULL,  
  7.                                                     --发票编号  
  8.    invoice_date DATE DEFAULT SYSDATE,                   --发票日期  
  9.    invoice_total  NUMBER(9,2)  CONSTRAINT invoice_total_nn  NOT NULL,  
  10.                                                     --发票总数  
  11.    payment_total NUMBER(9,2)   DEFAULT 0                --付款总数  
  12. )  

通过将CONSTRAINT定义在列类型后面,可以显式地创建约束,并能为约束指定约束名称。对于UNIQUE与PRIMARY KEY,还可以在表级别使用CONSTRAINT指定约束,比如在为一个表设置多个主键时,可以在表级别使用CONSTRAINT设置约束。在表级别与在列级别的效果是相同的,但是能提供更清晰的代码,将代码5.5的CONSTRAINT声明更改为表级别,实现如代码5.6所示。

代码  在表级别使用CONSTRAINT关键字

 
 
  1. CREATE TABLE invoice  
  2. (  
  3.    invoice_id NUMBER ,                                  --自动编号,唯一,不为空  
  4.    vendor_id NUMBER,                                    --供应商ID  
  5.    invoice_number VARCHAR2(50),                         --发票编号  
  6.    invoice_date DATE DEFAULT SYSDATE,                   --发票日期  
  7.    invoice_total  NUMBER(9,2) ,                         --发票总数  
  8.    payment_total NUMBER(9,2)   DEFAULT 0,               --付款总数  
  9.    CONSTRAINT invoice_pk PRIMARY KEY (invoice_id),  
  10.    CONSTRAINT vendor_id_un UNIQUE (vendor_id)  
  11. );  

上述代码相对于列类型来说最大的好处在于可以使用多列,比如通过在括号内输入以逗号分隔的多个列名,可以同时指定多列主键,例如如果要使用invoide_id和vendor_id作为主键,可以使用如下所示的代码:
 
 
  1. CONSTRAINT invoiceid_vendorid_pk PRIMARY KEY (invoice_id,vendor_id), 

在为表设计主键时,下面是一些常用的设置规则。

主键应该是对用户没有意义的,在一些数据表的设计中,不建议以材料编码或身份证号码及员工工号作为主键,主键应该只是一些具有唯一性标识的标识符,比如自增长的数字等。

主键应该是单列的,以便提高连接和筛选操作的性能,复合主键通常导致不良的外键,因此要尽量避免。

主键应该是不能被更新的,主键的主要作用是唯一标识一行,更新则违反了主键无意义的原则。

主键不应该包含动态更新的数据,比如时间戳、创建时间或修改时间等这些动态变化的数据。

主键最好由计算机自动生成,在Oracle中可以使用序列来为主键列生成值。

主键约束:SQL 92建议在建立一个表时定义一个主键,它其实就是:唯一约束+非空约束

 

创建外键约束

外键约束又称为引用约束,这种类型的约束主要用来在多个表之间定义关系,并强制引用完整性,与主键约束一样,外键约束也可以在列级别和表级别创建,使用关键字REFERENCES语句来定义,列级别的外键约束语法如下所示。

 

 
 
  1. [CONSTRAINT constraint_name]  
  2.   REFERENCES table_name (column_name)  
  3. [ON DELETE {CASCADE|SET NULL}]  

位于[]的可选部分指定CONSTRAINT和约束名称,ON DELETE {CASCADE|SET NULL}这行代码用来指示是否级联删除,当两个表中的两个字段建立了外键关联后,如果主键所在表中的值被删除,使用ON DELETE指定是否级联删除,CASCADE表示关联表中的内容一并删除,而SET NULL表示子表中的值设置为NULL。

注意:如果没有指定ON DELETE,默认情况下将使用CASCADE进行级联删除。

假定有一个表vendor,可以将invoice表的vendor_id与vendor表的vendor_id字段进行外键约束,也就是说,invoice表中的字段取值必须是vendor表中已经存在的供应商字段,vendor表的创建如代码5.7所示。

代码5.7  vendor表的定义代码

 

 
 
  1. CREATE TABLE vendors  
  2. (  
  3.    vendor_id NUMBER,                                        --供应商id  
  4.    vendor_name VARCHAR2(50) NOT NULL,                       --供应商名称  
  5.    CONSTRAINT vendors_pk PRIMARY KEY (vendor_id),       --主键  
  6.    CONSTRAINT vendor_name_uq UNIQUE (vendor_name)       --唯一性约束  
  7. )  

下面的代码创建invoice表,在列级别为invoice表的vendor_id字段与vendor表的vendor_id字段进行了关联,如代码5.8所示。

代码5.8  在invoice表中为vendor_id列创建外键关联

 

 
 
  1. CREATE TABLE invoice  
  2. (  
  3.    invoice_id NUMBER ,                                  --自动编号,唯一,不为空  
  4.    vendor_id NUMBER   REFERENCES vendors (vendor_id),   --供应商ID  
  5.    invoice_number VARCHAR2(50),                             --发票编号  
  6.    invoice_date DATE DEFAULT SYSDATE,                       --发票日期  
  7.    invoice_total  NUMBER(9,2) ,                             --发票总数  
  8.    payment_total NUMBER(9,2)   DEFAULT 0,                   --付款总数  
  9.    CONSTRAINT invoiceid_vendorid_pk PRIMARY KEY (invoice_id,vendor_id),  
  10.    CONSTRAINT vendor_id_un UNIQUE (vendor_id)  
  11. );  

通过使用REFERENCES语法,指定要关联的目标表名与字段,示例中指定vendors表的主键vendor_id列作为关联字段。

注意:在定义外键时,引用的表键必须是唯一性键值,一般建议使用关联表的主键作为关联字段。

同样可以在表级别使用CONSTRAINT关键字来创建外键约束,例如下面的代码在表级别使用CONSTRAINT定义了外键关联并指定了ON DELETE级联删除设置,如代码5.9所示。

代码5.9  在invoice表级别创建外键关联

 

 
 
  1. CREATE TABLE invoice  
  2. (  
  3.    invoice_id NUMBER ,                                  --自动编号,唯一,不为空  
  4.    vendor_id NUMBER,                                        --供应商ID  
  5.    invoice_number VARCHAR2(50),                         --发票编号  
  6.    invoice_date DATE DEFAULT SYSDATE,                   --发票日期  
  7.    invoice_total  NUMBER(9,2) ,                         --发票总数  
  8.    payment_total NUMBER(9,2)   DEFAULT 0,               --付款总数  
  9.    CONSTRAINT invoiceid_vendorid_pk PRIMARY KEY (invoice_id,vendor_id),  
  10.    CONSTRAINT vendor_id_un UNIQUE (vendor_id),  
  11.    CONSTRAINT invoice_fk_vendors FOREIGN KEY (vendor_id) REFERENCES vendors   
  12.    (vendor_id)   
  13.    ON DELETE CASCADE  
  14. );  

 


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle 外键约束用于维护表之间的引用完整性,它定义了一个表的一或多与另一个表的一或多之间的关系。这个关系可以是单向的,也可以是双向的。 在 Oracle 创建外键约束需要满足以下条件: 1. 外和所引用的的数据类型必须相同。 2. 外和所引用的的长度必须相同。 3. 外和所引用的必须都已经定义为 NOT NULL。 4. 外必须是索引创建外键约束的语法如下: ``` ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 FOREIGN KEY (外名称) REFERENCES 表名称 (名称); ``` 其,表名称是指需要添加外键约束的表名,约束名称是自定义的外键约束名称,外名称是需要添加外键约束名,表名称是被引用的表名,名称是被引用表的名。 例如,创建一个名为 "orders" 的表,它有一个外 "customer_id",引用了 "customers" 表的 "id" : ``` ALTER TABLE orders ADD CONSTRAINT orders_fk1 FOREIGN KEY (customer_id) REFERENCES customers (id); ``` ### 回答2: Oracle 外键约束是一种用于确保数据完整性的约束。它通过在级别上定义关联关系,限制了一个表的外与另一个表或唯一之间的关联关系。 外键约束可以用来保证数据的一致性和完整性。当我们在一个表创建外键约束时,它会将指定与另一个表的或唯一进行关联。这样,在插入、更新或删除数据时,系统会自动检查外键约束,确保数据操作不会破坏关联关系。 外键约束可以有以下几个特点: 1. 外关系必须在参照表上存在或唯一约束。 2. 外的数据类型必须与参照的数据类型匹配。 3. 外的值必须是参照表的或唯一存在的值。 4. 当参照表的或唯一更新或删除时,涉及到外的操作也会受到影响。 外键约束的作用有以下几点: 1. 数据完整性:外键约束可以保证在关联表之间维护数据的一致性,防止无效或不合法数据的插入或更新。 2. 级联操作:定义级联操作可以在参照表上进行更新或删除操作时同时更新或删除关联的外的数据,避免了手动处理关联数据的复杂性。 3. 查询优化:外键约束可以帮助优化查询,提高数据检索性能。 4. 数据模型的清晰性:通过外键约束,可以更清晰地定义表之间的关联关系,方便他人理解数据模型。 总之,Oracle 外键约束是一种强制性的关联关系,可以保证数据的一致性和完整性,提高数据库查询性能,并且使数据模型更加清晰易懂。 ### 回答3: Oracle外键约束是一种用来保持数据完整性的约束。它定义了两个表之间的关系,并防止数据库的无效数据。外键约束在两个表之间创建引用,一个表的一个是另一个表的或唯一。 通过外键约束,我们可以确保在从表的外只包含在已经存在的值。当我们向从表插入或更新数据时,如果外键约束被违反,Oracle将抛出一个错误,阻止操作继续进行。 外键约束可以执行以下操作: 1. 防止删除或更新的行,如果在从表的外仍然存在引用。这可以防止出现孤儿记录。 2. 防止插入或更新从表的行,如果在没有对应的或唯一值。这可以防止出现无效的引用。 通过使用外键约束,我们可以确保数据库的数据完整性和一致性。它可以减少数据错误和无效引用的可能性,并确保数据库的相关数据保持一致。 外键约束可以在创建表时定义,也可以在后期通过ALTER TABLE语句添加。我们可以选择指定外键约束的名称,以及在违反约束时的动作,如RESTRICT、CASCADE或SET NULL。 总而言之,Oracle外键约束可以确保在表之间保持有效关系,防止无效引用和孤儿记录,并维护数据库的数据完整性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值