Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103401539
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-03-20 21:18:33

 
许多人喜欢在 CREATE TABLE 语句中使用约束键字来创建主键、外键、惟一性和其他约束。他们认为这是一种创建约束的简单且方便的方法。下面是一个例子:

CREATE TABLE sub_accounts (
sub_acc INTEGER PRIMARY KEY,
ref_num INTEGER NOT NULL,
ref_type INTEGER NOT NULL,
sub_descr CHAR(20),
FOREIGN KEY (ref_num, ref_type) REFERENCES accounts
(acc_num, acc_type));

 


遗憾的是,对于数据库的性能和管理,这样做并不好。当 Informix 读取以上 CREATE TABLE 语句时,它将自动创建两个索引,一个用于 sub_acc 上的主键,一个用于 ref_num 和 ref_type 上的外键。然后,它将自动为每一个索引指派一个系统编号,并将该编号用作索引名,对于开发人员和设计人员而言,这没有任何意义。更糟的是,这些索引是在数据 dbspace 内部创建的,因此会对数据库总体性能产生负面影响,所以 Informix 文档并不建议这样做。此外,在删除该表的主键或外键约束时,将自动删除这些索引;因此,如果需要在查询中使用这些索引,则需要重新创建它们。如果表中有数百万行,那么这可能是一个十分耗时的过程。 

因此,在表中创建或添加约束的正确过程如下:

创建不含约束键字的表。 
在将使用约束的列上创建索引。 
更改表来添加约束。 
下面是一个很好的例子: 

CREATE TABLE item(
Item_num  smallint,
Order_num  integer , 
Stock_num  smallint,
Manu_code  char(3) ,
Quantity  smallint,
Total_price  money(8)

IN data1; 
CREATE UNIQUE INDEX item_idx1 ON item (item_num) IN idx1; 
ALTER TABLE item ADD CONSTRIANT PRIMARY KEY (item_idx1);

 本例中,您可以在不同的数据库空间(dbspace)中放置索引和数据,避免与索引一起删除主键约束。
阅读(1102) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~