当前位置:首页 » 操作系统 » db2数据库主键

db2数据库主键

发布时间: 2022-05-11 03:34:12

Ⅰ DB2数据库表的主键怎么更新

alter table tablename alter primary key (column1,column2,...)
如果不行,先把主键drop掉,再加
alter table tablename drop primary key
alter table tablename add primary key (column1,column2,...)
网络应该也可以搜到的~

Ⅱ db2主键可以多个吗

任何数据库主键都只能有一个,其他可以作为主键但没有选为主键的叫做候选键。比如学生表可以用学号或身份证号唯一标识,如果选学号作为主键,那么身份证号就是候选键...

Ⅲ DB2数据库索引问题-怎样更快更效率

1.只对唯一性较强并且使用较频繁的字段建立单个索引,比如分别对key、a 建立索引。目前上海移动经分仓库就是按这个大的原则建立的。
因为联合索引的话对条件查询的顺序打乱就无效了,单独建立索引用来适应大多数开发情况,且能较少数据冗余。

2.针对某些特别慢的sql条件建立索引,这种情况是考虑某些SQL的及时性考虑,及时性高的,SQL的结果集重要的,单独优化。

Ⅳ db2db 数据库转换设置自增的必须为主键 但是不是怎么办

以sqlserver2008R2数据库为例。可以用如下方法:
1、先建表:

1
2
3

create table test
(id int not null,
name varchar(10))

2、在图形界面,找到test表:

3、右键此表名,选择“设计”。

4、右侧出现的页面,找到要设置主键的列,ID列,然后右键,选择“设置主键”。

5、下面一步是要设置自增,在左侧列表中,右键“id列”,然后选择“属性”。

6、其中,找到“标识规范”,标识增量为每次增加多少,标识种子代表起始数值大小。

Ⅳ 数据库是DB2,多个索引都有某一个字段,那么DB2会执行那一个呢

你的两个索引都是复合索引。所以字段的顺序是很重要的,索引的第一个字段是主索引码。索引B+树是根据主索引码构造的。index1(oid,name)和index1(name,oid)有天壤之别。
看样子,oid是主码吧,它具有唯一性,所以,根据oid、name、age查询数据时,会优先使用index1(姑且认为index1是(oid,name)形式),在index1中使用oid进行索引页的查找,因为oid值是唯一的,直接就能快速定位,根本用不到name和age。如果oid不是主码,如果仍然使用index1,那么当oid不足以区分表中行的时候,才会使用name和age进一步筛选。
当然,上面的内容也不是绝对的,一方面,DB2会对整个数据库收集统计信息,根据表中数据的分布和频率,有可能会选择index2,甚至不使用索引,直接表扫描;另一方面,如果你的查询语句中where后面的条件(谓词)是不可索引谓词(比如oid<>10),对应的索引同样不可用。

针对你的数据库系统到底会使用那个,你可以直接使用explain工具对查询优化过程进行查看。最简单的是事业visual explain,图形化的,会直观显示优化过程和结果。
你的问题属于查询优化的内容,实际上挺复杂的,建议你找些专业的介绍看看。(看你描述似乎不大专业)

Ⅵ DB2数据库在已存在的表上新增自增长主键

create
table
tabname(col1
type1
[not
null]
[primary
key],col2
type2
[not null],..)

Ⅶ db2建表语句主键最长是多少位

数据库管理器中表的行长度不能超过:
* 在具有 4K 页大小的表空间中,是 4005 字节
* 在具有 8K 页大小的表空间中,是 8101 字节。
* 在具有 16K 页大小的表空间中,是 16293 字节。
* 在具有 32K 页大小的表空间中,是 32677 字节。

这个是DB2的硬限制,USERSPACE1是默认创建的4K页大小的表空间。数据页大小在表空间创建时指定,不可更改。所以你需要做的是建一个更大数据页大小的表空间,然后把表建到这个表空间, 命令如下:
1. create tablespace ts32k pagesize 32k managed by database using (FILE 'D:\ts32k\cont1' 2000)
2. create table ..... in ts32k
解决中文存储进数据库超过字段最大容量的问题

Ⅷ DB2中怎么设置主键

创建表时指定primary key,如:
create table mytab(id int not null primary key,
name char(10)
)
注意,not null 不可省略,必须与primary key 同时指定!

Ⅸ 如何用代理键实现 DB2 UDB 主键

代理键是生成惟一序列号的一种有效方法。从本文中可以了解三种实现:传统方法,使用键管理器,以及使用新的 DB2 UDB 特性。简介使用代理键解决方案是为了发现一种生成惟一序列号的有效方法。本文描述了三种实现: 使用传统方法。 使用键管理器。 使用DB2 UDB 特性。 代理键也叫 内键(internal key)。当创建一个表时,可以添加一个额外的列作为代理键。这个列应该是 NOT NULL,并且没有商业意义。可以将该代理列指定为主键列。例如可以有一个数字代理列。代理键的值从某一个数字开始,例如 "1",以这个数字作为该列在表中第一行的值,之后的每一行中该列的值都按 1 递增。 例如,如果我们有表 EMPLOYEE:CREATE TABLE EMPLOYEE ( FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2)) 那么可以添加一个代理键列 SERIALNUMBER,并将其指定为主键列。这样,这个表的定义就变为:CREATE TABLE EMPLOYEE ( SERIALNUMBER BIGINT NOT NULL, FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 那么,怎样将惟一的值赋给每一行的 SERIALNUMBER 列呢?首先需要为代理键生成惟一的值。下面我将讨论三种可行的解决方案。回页首使用传统方法解决方案的思想传统方法是使用简单的 SQL 或触发器生成惟一的值。示例以表EMPLOYEE 为例。您可以在 INSERT 语句中实现代理键生成函数:INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES ((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE)+1, ‘John’, ‘Smith’, 999.99) SQL 语句 " (SELECT MAX(SERIALNUMBER) FROM EMPLOYEE)+1 " 将找出最大的 SERIALNUMBER 并将其加 1,这样新行就有一个惟一的 SERIALNUMBER。 这样做存在的一个问题是,当将第一行插入表中时,可能会得到如下错误: SQL0407N Assignment of a NULL value to a NOT NULL. SQLSTATE=23502. 得到上述错误的原因是,当表为空时," SELECT MAX(SERIALNUMBER) FROM EMPLOYEE " 的返回为 NULL。因此,我们必须使用 COALESCE() 来处理这个问题: INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES (COALESCE((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE), 0)+1, ‘John’, ‘Smith’, 999.99) 另一种传统方法是使用触发器来生成代理键: CREATE TRIGGER AUTOSURROGATEKEY NO CASCADE BEFORE INSERT ON EMPLOYEE REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL BEGIN ATOMIC SET N.SERIALNUMBER = COALESCE((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE), 0)+1; END 优点及问题传统方法易于理解,而且容易在所有系统上实现。但是,这种实现实际上会导致事务处理系统中出现并发问题。因为该实现只允许一次执行一条 INSERT 操作。 因此,在获得最大的 SERIALNUMBER 之前," SELECT MAX(SERIALNUMBER) FROM EMPLOYEE " 必须等待其他所有事务完成对表 EMPLOYEE 的 INSERT 或 UPDATE 操作。例如,如果有两个事务正在对 EMPLOYEE 表进行 INSERT 操作,那么其中有一个事务会被另一个事务阻塞。显然,这种“逐次插入”的解决方案不适合多用户的事务处理系统。 回页首使用键管理器解决方案的思想很多大型的应用程序使用键管理器方法维护所有表的代理键。键管理器可以是一个助手类。每当需要向表插入一个行时,便可以调用键管理器生成新的键值,然后将获得的键值插入新行。示例首先,需要创建表 KEYS 来记录每个表的当前代理键值。键管理器类将使用该表生成新键值。CREATE TABLE KEYS ( TABLENAME CHAR(256), COLNUMNAME CHAR(256), SURROGATEKEYVALUE BIGINT, INCREMENT BIGINT, PRIMARY KEY(TABLENAME, COLNUMNAME)); 第二,将新表(例如表 EMPLOYEE)注册到表 KEYS 中。INSERT INTO KEYS (TABLENAME, COLUMNNAME, SURROGATEKEYVALUE, INCREMENT) VALUES (‘EMPLOYEE’, ‘SERIALNUMBER’, 0, 1); 第三,编写 KeyManger 类来维护每个已注册表的代理键。KeyManager 将提供两个方法:/** *Intialize the KeyManger */ KeyManager.singleton(); /** *Return the unique surrogate key value according to the input table *name and column name. */ KeyManager. GetSurrogateKey(String tableName, String columnName); 要查看更详细的 KeyManger 的代码,请参考附录。 第四,调用 KeyManger 来获得主键值: … KeyManager km = KeyManager.singleton(); Long surrogateKey = km.getSurrogateKey("EMPLOYEE", "SERIALNUMBER"); … 优点和问题显然,键管理器是模块化设计的一个很好的例子。键管理器封装了代理键生成函数。这种实现也易于定制。您可以在 KEYS 表中为 SURROGATEKEYVALUE 或 INCREMENT 指定不同的值,以得到不同的代理键。而且,这种实现可以在大多数数据库系统上实施。但是,为了进行维护,需要一个单独的表和编写代码。所以,这种方法更适合于大型的跨数据库系统。 回页首使用DB2 UDB 特性DB2 UDB 提供了三种方法来生成惟一值。您可以使用这些方法来实现代理键。DB2 UDB Version 6.1 中的 GENERATE_UNIQUE() SQL 函数。 DB2 UDB Version 7.2 中 CREATE TABLE 语句的 IDENTITY 选项。 DB2 UDB Version 7.2 中的 SEQUENCE 对象。 GENERATE_UNIQUE()解决方案的思想GENERATE_UNIQUE() 最初是在 DB2 UDB Version 6.1 中提供的一个 SQL 函数。该函数返回当前系统时间戳。我们可以使用该函数为代理键列生成惟一值。示例CREATE TABLE EMPLOYEE ( SERIALNUMBER CHAR(13) FOR BIT DATA NOT NULL, FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 然后可以用下面的 SQL 语句插入一行:INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(GENERATE_UNIQUE(), ‘John’, ‘Smith’, 999.99) 优点和问题这里需要清楚两件事情。首先,当多个事务在同一时刻插入行时,GENERATE_UNIQUE() 可能会返回相同的时间戳。在这种情况下,GENERATE_UNIQUE() 不能为每个事务生成一个惟一的返回值,因而这种方法不适合有大量事务的系统。第二,一旦系统时钟需要向后调整,那么 GENERATE_UNIQUE() 将可能返回重复的值。 由于上述限制,我决不会在生产系统中使用 GENERATE_UNIQUE()。但是,当您需要在有限的时间内完成一个原型时,这也许是一种选择。 CREATE TABLE 语句中的 IDENTITY 选项解决方案的思想IDENTITY 是 DB2 UDB Version 7.1 和后期版本提供的 CREATE TABLE 语句中的一个选项。在创建表时,可以将某个列指定为 IDENTITY 列。对于每条 INSERT 语句,DB2 将负责为其中的这一列生成一个惟一的值。 示例CREATE TABLE EMPLOYEE ( SERIALNUMBER BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 然后可以用下面的语句插入一行: INSERT INTO EMPLOYEE (FIRSTNAME, LASTNAME, SALARY) VALUES ( ‘John’, ‘Smith’, 999.99) INSERT 语句不需要指定 SERIALNUMBER 列的值。DB2 UDB 将根据列的定义自动生成惟一值,即 "GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)"。优点和问题IDENTITY 函数在大多数情况下是代理键函数的一个好的解决方案。DB2 import 和 export 实用程序也支持 IDENTITY 选项。然而,在某种情况下,这种解决方案不大方便。在运行 INSERT 语句之后,应用程序将永远都不知道放入了主键列中的是什么值。如果应用程序必须继续向子表插入一个行,那么它就不得不对父表运行一条 SELECT 语句,以得到主键值。不过,如果这一点对于您的系统不成问题的话,那么使用 IDENTITY 选项是一个好主意。 SEQUENCE 对象解决方案的思想SEQUENCE 对象是在 DB2 UDB Version 7.2 中引入的一个特性。用户可以在数据库中创建一个 SEQUENCE 对象,就像创建表对象或视图对象一样,然后从 SEQUENCE 中请求值。DB2 保证用户每次可以得到一个惟一的序列值。 示例您可以在数据库中创建一个 SEQUENCE 对象:CREATE SEQUENCE EMPSERIAL AS BIGINT START WITH 1 INCREMENT BY 1 如果有一个如下所示的 EMPLOYEE 表: CREATE TABLE EMPLOYEE ( SERIALNUMBER BIGINT NOT NULL, FIRSTNAME CHAR(64), LASTNAME CHAR(64), SALARY DECIMAL(10, 2), PRIMARY KEY (SERIALNUMBER)) 那么可以用下面的语句插入一个行: INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'John', 'Smith', 99.99) 在这里使用 " NEXTVAL FOR EMPSERIAL " 从 SEQUENCE 中获得惟一值。 您可以使用 " PREVVAL FOR EMPSERIAL " 获得当前连接会话中最近生成的序列值。应用程序就可以知道放入主键列中的是什么值,从而继续向子表插入一个行。这里,“在当前连接会话中”这一点很重要,这意味着 "PREVVAL" 将只返回在相同连接会话中生成的值。 例如,考虑这样的情况:有两个应用程序连接到数据库,并按照如下顺序运行下面的 SQL 语句。 (假设 SEQUENCE " EMPSERIAL " 的当前值是 3)。 应用程序 1:
INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'Martin', 'Wong', 1000.00)�0�2从EMPSERIAL 生成的 " NEXTVAL " 是 4。 应用程序 2:
INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'Patrick', 'Chan', 99.99) �0�2从EMPSERIAL 生成的 " NEXTVAL " 是 5。 应用程序 1:
SELECT PREVVAL FOR EMPSERIAL FROM EMPLOYEE �0�2" PREVVAL " 将返回 4,而不是 5。 而且, PREVVAL 和NEXTVAL 的值不会受事务回滚的影响。 例如,假设 SEQUENCE " EMPSERIAL " 的当前值是 30。某个应用程序开始了一个事务: INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME, SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'William', 'Chen', 99.99) 执行ROLLBACK 操作。 然后,如果运行: SELECT PREVVAL FOR EMPSERIAL FROM EMPLOYEE 则" PREVVAL " 将返回 31,而不是 30。 优点和问题SEQUENCE 是最近 DB2 UDB 为生成惟一值而实现的函数。它还有一个缓存函数,用于提高性能(要了解详细信息,请参阅 IBM DB2 UDB SQL Reference)。该函数比 IDENTITY 函数更灵活,因为它是数据库中的一个独立对象。必要时候,可以通过运行 ALTER SEQUENCE 语句更改其设置。 如果系统只在 DB2 UDB 上运行,那么 SEQUENCE 也许是最好的解决方案,因为它易于使用,而且不像键管理器那样需要额外的代码,并且可以随需求的变化很轻易对其进行更改。回页首结束语本文描述了实现作为主键的代理键的三种方法。文中主要讨论了如何为代理键生成惟一的序列值。传统方法适合于简单的、单用户(非并发)系统。对于实现对于大型系统和跨平台系统,键管理器是一个好选择。但是,如果项目只在 DB2 UDB 上运行的话,可以考虑 DB2 UDB 提供的特性。IDENTITY 和 SEQUENCE 函数提供了一种容易的、灵活的解决方案。在创建 IDENTITY 列和 SEQUENCE 对象时,可以使用很多选择。请参阅 IBM DB2 UDB Administration Guide和IBM DB2 UDB SQL Reference,以获得完整的细节。 回页首附录import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class KeyManager { private static KeyManager singleton; private PreparedStatement getKeyStmt = null; private PreparedStatement updateKeyStmt = null; static final String db2Driver = "COM.ibm.db2.jdbc.app.DB2Driver"; static final String db2UrlPfx = "jdbc:db2:"; public KeyManager Singleton() throws ClassNotFoundException, SQLException{ if (singleton == null) { if (singleton == null) singleton = new KeyManager(); } return singleton; } private KeyManager() throws ClassNotFoundException, SQLException{ Class.forName(db2Driver); Connection connection = DriverManager.getConnection(db2UrlPfx+ "dbName", "userName", "password"); getKeyStmt = connection.prepareStatement("SELECT SURROGATEKEYVALUE FROM KEYS WHERE TABLENAME = ? AND COLUMNNAME = ?"); updateKeyStmt = connection.prepareStatement("UPDATE KEYS SET SURROGATEKEYVALUE = SURROGATEKEYVALUE + INCREMENT WHERE TABLENAME = ? AND COLUMNNAME = ?"); } public Long getSurrogateKey(String tableName, String columnName) throws SQLException{ Long keyValue = null; getKeyStmt.setString(1, tableName); getKeyStmt.setString(2, columnName); updateKeyStmt.setString(1, tableName); updateKeyStmt.setString(2, columnName); updateKeyStmt.execute(); ResultSet rs = getKeyStmt.executeQuery(); if (rs.next() == true) { keyValue = new Long(rs.getLong(1)); } return keyValue; } } 参考资料 您可以参阅本文在 developerWorks 全球站点上的 英文原文.
IBM DB2 UDB Administration GuideIBM DB2 UDB SQL Reference关于作者�0�2Jason Zhang 是 IBM 加拿大多伦多的实验室的一名软件开发人员,从事电子商务开发已经有 5 年多的时间。

热点内容
安卓手机用什么软件传软件到苹果 发布:2024-10-09 09:11:02 浏览:367
苹果安卓怎么传抖音 发布:2024-10-09 09:10:18 浏览:822
连接电视路由器如何设置密码 发布:2024-10-09 09:10:16 浏览:781
c语言取模与取余 发布:2024-10-09 08:52:51 浏览:267
安卓怎么像苹果一样滑动返回 发布:2024-10-09 08:20:46 浏览:758
gp数据库行 发布:2024-10-09 08:10:37 浏览:417
会计公需课登录密码是什么 发布:2024-10-09 08:08:20 浏览:800
wps怎么怎么加密码忘了怎么办 发布:2024-10-09 07:54:30 浏览:992
埋堆堆怎样更改缓存路径 发布:2024-10-09 07:48:12 浏览:550
壹号本1s加存储 发布:2024-10-09 07:43:51 浏览:546