日期:2014-05-16 浏览次数:20544 次
在执行DML语句(例如INSERT、UPDATE或DELETE)时,数据库会确保表中的行都可以维护自身的完整性。这就是说对表中行所做的任何修改都不能影响表的主、外键关系。
下面来看几个介绍主键约束的例子。customers表的主键是customer_id列,这意味着customer_id列中保存的每一个值都必须是唯一的。如果试图插入一个与主键列值重复的行,数据库就会返回ORA-00001错误,例如:
SQL> INSERT INTO customers (
2 ????customer_id, first_name, last_name, dob, phone
3?? ) VALUES (
4?? 1, 'Jason', 'Price', '01-JAN-60', '800-555-1211'
5?? );
INSERT INTO customers (
*
ERROR at line 1:
ORA-00001: unique constraint (STORE.CUSTOMERS_PK) violated
如果试图将主键值修改为表中已有的一个主键值,数据库也会返回同样的错误:
SQL> UPDATE customers
2?? SET customer_id = 1
3?? WHERE customer_id = 2;
UPDATE customers
*
ERROR at line 1:
ORA-00001: unique constraint (STORE.CUSTOMERS_PK) violated
所谓外键关系就是一个表中的列引用了其他表中的列。例如,products表中的product_type_id列引用了product_types表中的product_type_id列。 product_types表称为父表(parent table),而products表则称为子表(child table),这是因为products表中的product_type_id列依赖于product_types表中的product_type_id 列。
如果试图向products表中插入一行,但此行的 product_type_id不存在,数据库就会返回ORA-02291错误。这个错误说明数据库无法找到一个匹配的父键值(此处父键就是 product_types表中的product_type_id列)。在下面这个例子中,就返回这样一个错误,因为product_types表中不存在product_type_id为6的行:
SQL> INSERT INTO products (
2 ?? ?product_id, product_type_id, name, description, price
3?? ) VALUES (
4?? 13, 6, 'Test', 'Test', NULL